perm filename A[HAK,HPM] blob
sn#156826 filedate 1975-04-30 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00025 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 TITLE FINDER V.013 FOR STANFORD 6.00 AND BEYOND
C00011 00003 SUBTTL DATA STORAGE FOR LOGIN
C00021 00004 SUBTTL ALARUMS AND DIVERSIONS
C00023 00005 SUBTTL VARIOUS FLAVORS OF OUTPUT STUFF
C00031 00006 SUBTTL IF THE USER IS LOGGED IN ALREADY
C00034 00007 SUBTTL FIND
C00036 00008 SUBTTL THINK ABOUT PRIVILEGES
C00042 00009 SUBTTL GET
C00044 00010 SUBTTL LIST USER DATUM.
C00048 00011 SUBTTL MODIFY A USER'S INFO ENTRY
C00052 00012 SUBTTL READ UFD
C00053 00013 SUBTTL DREAD READ A WHOLE FILE IN DUMP MODE.
C00056 00014 SUBTTL LOGIN: INITIALIZE AND DO THE LOGIN
C00065 00015 SUBTTL CONTINUE. CHECK FOR SPECIALS
C00083 00016 SUBTTL HERE IMEDIATELY AFTER LOGIN.
C00086 00017 SUBTTL DO THE LOGIN NOW!
C00090 00018 SUBTTL DO-ALL SCANNER. MAXIMUM UTILITY AND INTOLERANCE.
C00098 00019 SUBTTL DO ALL THE MESSAGE STUFF FROM [2,2]
C00110 00020 SUBTTL BUFFERED READER AND OPTION FILE STUFF
C00122 00021 SUBTTL UCHECK CHECK VALIDITY BEFORE MAKING NEW UFD.
C00126 00022 SUBTTL PREPARE SYSTEM STATISTICS.
C00129 00023 A FOOL AND HIS MONEY ARE SOON PARTED
C00132 00024 ALL HALLOWS EVE
C00136 00025 TEXT OF HELP MESSAGES
C00141 ENDMK
C⊗;
TITLE FINDER V.013 FOR STANFORD 6.00 AND BEYOND
SUBTTL R. GORIN 29-JAN-72
; DEFINITIONS
IFDEF FOR,<MACRO←←0;>MACRO==1 ;PROCESSOR SELECTOR
COMMENT $
* QUIET RUNNING FOR PTY'S
* MESSAGES FROM [2,2]
* NOTICE.TXT GENERAL NOTICE
* DAY.TXT TODAY'S MESSAGE
* MAINT.TXT 5 DAY MAINTAINENCE SCHEDULE
* 'PRJ'.MSX PROJECT AREA MESSAGE
* 'PRG'.MSG PERSONAL MESSAGE FOR PROGRAMMER
* "SMART" MESSAGE ROUTINES
* PRIVILEGE BITS, PASSWORDS AND DATE-TIME OF LAST LOGIN
* FROM UFD'S RETRIEVAL DATA
* READS USER'S FILE OPTION.TXT FOR LOGIN OPTIONS
* LOGRUN LOGRUN OPTION
* INIT RUN INIT IN USRS AREA IF IT EXISTS
* WHO START WHO LINE
* MESSAGE TYPE MESSAGES WITHOUT ASKING
* SETS USER'S SERVICE LEVEL BY REQUEST OR TO HIS RESERVATION
$
IFE MACRO,<
DEFINE DEF(A,B)<
A←B>
DEFINE SDEF(A,B)<
A←←B>
>
IFG MACRO,<
DEFINE DEF(A,B)<
A=B>
DEFINE SDEF(A,B)<
A==B>
>
EXTERN JOBFF,JOBREL,JOBDDT
OPDEF RESET [CALLI]
OPDEF LEYPOS [702300B17] ;SET LINE EDITOR Y POSITION
OPDEF SLEVEL [CALLI 400044]
OPDEF RLEVEL [CALLI 400054]
OPDEF SWAP [CALLI 400004]
OPDEF LOGIN [CALLI 15]
OPDEF EXIT [CALLI 12]
OPDEF SETPRV [CALLI 400066]
OPDEF SLEEP [CALLI 31]
OPDEF PJOB [CALLI 30]
OPDEF GETPPN [CALLI 24] ;CAN'T BE USED WHEN JACCT SET!
OPDEF JBTSTS [CALLI 400013]
OPDEF DATE [CALLI 14]
OPDEF TIMER [CALLI 22]
OPDEF CORE [CALLI 11]
OPDEF CTLV [CALLI 400001] ;SUPRESS DUPLEXING (TOGGLES)
OPDEF TTCALL [51B8]
OPDEF INCHRW [TTCALL]
OPDEF OUTCHR [TTCALL 1,]
OPDEF INCHRS [TTCALL 2,]
OPDEF OUTSTR [TTCALL 3,]
OPDEF INCHWL [TTCALL 4,]
OPDEF INCHSL [TTCALL 5,] ;SKIP AND INPUT ONE IF LINE READY
OPDEF GETLIN [TTCALL 6,]
OPDEF RESCAN [TTCALL 10,]
OPDEF CLRBFI [TTCALL 11,]
OPDEF INSKIP [TTCALL 13,]
OPDEF PTWR1W [711340,,0] ;PTYUUO 7,
OPDEF PTWR1S [711300,,0] ;PTYUUO 6,
OPDEF PEEK [CALLI 33]
OPDEF GETPRV [CALLI 400115]
;ASSEMBLY FLAGS
SDEF(PTYBIT,4000) ;LINE CHAR. PTY LINE
SDEF(IMPBIT,1000) ;THIS AND PTYBIT MEANS THIS IS AN IMP
SDEF(JLOG,10000) ;JOB IS LOGGED IN. BIT IN JBTSTS
SDEF(PDLEN,20) ;SIZE OF PUSH-DOWN LIST
SDEF(UFDN,4) ;LENGTH OF UFD ENTRY
SDEF(MFDTRK,1) ;TRACK WHERE MFD IS FOUND
SDEF(INFON,5) ;LENGTH OF INFO DATA AREA
SDEF(INFBAS,13) ;LOCATION OF INFO DATA IN RETRIEVAL
SDEF(MAINTM,254) ;ADDRESS OF MAINTMODE IS FOUND AT ABS 254
SDEF(EXPMOD,262)
SDEF(NOLOGI,267) ;ADDRESS OF THE NO LOGIN CELL IN SYSTEM.
SDEF(PTYJOB,270) ;CELL TO PEEK IN TO FIND PTYJOB
SDEF(TTYNUM,221) ;CELL TO GET DATA ABOUT THE NUMBER OF TELETYPES.
SDEF(PRJPRG,211) ;POINTER TO PRJPRG IN SYSTEM
; INDICIES TO INFON
SDEF(LOSPSW,0) ;PASSWORD INDEX
SDEF(PRVBIT,1) ;USER'S PRIV. BITS
SDEF(LASDAT,2) ;LAST DATE WHEN HE WAS LOGGED IN
SDEF(DEFPRO,3) ;DEFAULT PROTECTION
SDEF(DSK,17) ;READ/WRITE CHANNEL FOR DSK.
SDEF(DMP,16) ;DISK FOR DUMP MODE
SDEF(TTY,15)
SDEF(DPYBIT,400000) ;III BIT IN GETLIN
SDEF(CTYBIT,200000) ;CTY
SDEF(DDBIT,20000) ;DD BIT IN GETLIN
SDEF(ME,2) ;PERSONAL MESSAGE FROM LOGIN
SDEF(MESSAG,4) ;TYPE [2,2] MESSAGE AUTOMATICALLY
SDEF(RPGSW,10) ;WE ARE RESCANNING LOGIN LINE
;VACANCY
SDEF(CTLVF,40) ;FLAG TO REMEMBER CTLV MODE
SDEF(PTYLIN,200) ;SET IF PTY
SDEF(CTYLIN,400) ;SET IF CTY LOGIN
SDEF(DPYLIN,1000) ;SET IF EITHER III OR DD DISPLAY
;SDEF(GODBIT,2000) ;SET IF ε GOD TABLE IS COMING IN
SDEF(MAINT,4000) ;SET IF MAINTMODE IN SYSTEM ≠ 0
SDEF(NEGF,10000) ;SET TO FLUSH A PRIVILEGE
SDEF(NODATE,20000) ;SET TO PREVENT LASDAT UPDATE
SDEF(NOTNOW,40000) ;SET IF NOLOGIN IN SYSTEM ≠ 0
SDEF(IMPLIN,100000) ;SET IF THIS IS AN IMP
SDEF(FOOLS,200000) ;SET IF TODAY IS APRIL 1.
SDEF(DIGEST,400000) ;SET FOR NEWS DIGEST.
SDEF(PORNO,1) ;FL LEFT. SET TO RUN THE PORNO PROGRAM.
SDEF(NOMAIL,2) ;DON'T ASK ABOUT MESSAGES.
SDEF(%INIT,4) ;INIT OPTION
SDEF(LOGRUN,10) ;WE HAVE A PROGRAM TO RUN LATER.
SDEF(COOKEE,20) ;HIGHER BROW FORTUNE COOKIES
;PRIVILEGE BITS
SDEF(INFPRV,20) ;ACCESS TO INFO DATA IN UFD
SDEF(PROPRV,100000) ;RENAME THRU FILE SYSTEM IS OK
SDEF(REAPRV,40000) ;READ THRU FILE SYSTEM IS OK
SDEF(WRTPRV,20000) ;WRITE THRU FILE SYSTEM IS OK
SDEF(DAWPRV,200000) ;DISK ABSOLUTE WRITE PRIVILIGE
SDEF(LUPPRV,1)
SDEF(LOGPRV,DAWPRV!INFPRV!PROPRV!REAPRV!WRTPRV!LUPPRV) ;PRIVILEGES FOR LOGIN
DEF(FL,0) ;THE ACCUMULATOR DEFINITIONS
DEF(A,1)
DEF(B,2)
DEF(C,3)
DEF(D,4)
DEF(W,5)
DEF(X,6)
DEF(Y,7)
DEF(Z,10)
DEF(K,11)
DEF(L,12)
DEF(M,13)
DEF(N,14)
DEF(TAC,15) ;VERY TEMP. AC
DEF(TAC1,16) ;ANOTHER VERY TEMP AC
DEF(P,17)
SDEF(FORLEN,110) ;RADIX 8 LENGTH OF FORTUNE TABLE
NETGUE==0
IFN NETGUE,<
SDEF(NGNMWD,14) ;LENGTH OF BUFFER FOR NETGUE'S REAL NAME
SDEF(NGNMLN,5*NGNMWD-1) ;DITTO IN CHARACTERS
>
LOC 137
13 ;JOBVERSION
RELOC 0
SUBTTL DATA STORAGE FOR LOGIN
SPYNOW: 'SPYNOW' ;THIS AND =31 MORE WORDS IS MAILED
SPYNAM: 0 ;PPN OF GUY WE'RE SPYING ON.
SPYTAB: ' RLL' ;TABLE OF NETWORK USERS TO SPY ON.
' SREG'
SDEF(SPYLEN,.-SPYTAB)
LPBITS: XWD 400000,'PRI' ;PRIVILEGE PRIVILEGE
XWD 200000,'DAW' ;DISK ABSOLUTE WRITE
XWD 100000,'PRO' ;FILE SYSTEM RENAME
XWD 40000,'REA' ;FILE SYSTEM READ
XWD 20000,'WRT' ;FILE SYSTEM WRITE
XWD 10000,'UDP' ;UDP EXTENDED ACCESS
XWD 4000,'UPG' ;SELECT OTHER III'S
XWD 2000,'MES' ;TTYMES UUO
XWD 1000,'KIL' ;CONSOLE KILL COMMAND
XWD 400,'DEV' ;DET/ATT DEVICE
XWD 200,'SEG' ;SEGMENT ACCESS PRIV
XWD 100,'SSL' ;SET SYSTEM SERVICE LEVEL TABLE
XWD 40,'ACW' ;ABSOLUTE CORE WRITE (SETPR2)
XWD 20,'INF' ;DISK ABSOLUTE READ
XWD 10,'TLK' ;CAN DO TALKS
XWD 4,'FBW' ;FAST BAND WRITE OR WRONG
XWD 2,'XGP' ;XGP FONT ACCESS.
XWD 1,'LUP' ;The Not Telnet Privilege
SDEF(LPBLL,.-LPBITS)
RPBITS: ;RIGHT SIDE BITS.
SDEF(RPBLL,.-RPBITS)
ALLPRV: 777775,,0 ;THESE ARE THE LEGAL ONES FOR USERS
;NOTE: XGPPRV ISN'T ALLOWED.
MSGPPN: ' 2 2' ;PLACE TO FIND MESSAGES
CRLF: BYTE(7)15,12
TRNSWP: SIXBIT /DSK/ ;FOR INIT OPTION.
SIXBIT /INIT/
SIXBIT /DMP/
0
TRNUSR: 0 ;PUT PPN HERE
LRB: 'SYS '
LRB1: 'LOGRUN'
'DMP '
0
0
PRB: 'SYS '
PRB1: 'PRN '
'DMP '
0
0
REMOTE: 10 ;DIAL UP LINE NUMBERS
11
0 ;0-5 ARE PINE HALL
1
2
3
; 4 in prancing pony
5
16 ;16 IS IMLAC IN POLYA LIBRARY
SDEF(REMTL,.-REMOTE) ;TABLE SIZE
PROTAB: ' 1 2' ;PROTECT FROM LOGIN.
SYSPPN: ' 1 3'
GOD: ' 1 1'
' DOC'
PROTLN==.-PROTAB
;PROTECT FROM NETWORK LOGIN
NNETAB: 'ACTREG' ;I KNOW HOW TO GET AROUND IT
' SYS' ;ANYONE USING SYS OUGHT TO ALSO.
NNETLN==.-NNETAB
MSGL1: ;LIST OF MESSAGE FILES OF INTEREST TO LOGIN
'X ' ;EXPERIMENTAL WARNING MESSAGE!
MSGPG1: 0 ;PURGER MESSAGES.
MSGPRG: 0 ;PROGRAMMER MESSAGE
MSGPRJ: 0 ;PROJECT MESSAGE
PPNMES: 0 ;PPN MESSAGE.
MSGPG2: 0 ;AP NOTICE TO PERSON
'NOTICE' ;LIST OF THE SYSTEM MESSAGE FILES OF INTEREST
EVENTX: 0 ;TODAY'S DAYCNT IN OCTAL FOR EVENT FILE
EVENTY: 0 ;TOMORROW'S DITTO
EVENTZ: 0 ;MONDAY'S DITTO IF TODAY IS FRIDAY
'DAY ' ;
'MAINT ' ;
'FORTUN' ;COOKIE
'DIGEST' ;AP NEWS DIGEST FILE
SDEF(MSGLTL,.-MSGL1) ;LENGTH OF MESSAGE TABLE
MSGPG3==137
MSGPG4==100+20+4
MSGL2: XWD 'TXT',4 ;CODE 4: SEND MESSAGE ONLY IF EXFLAG SET
XWD 'PUR',5 ;CODE 5: SEE BELOW
XWD 'MSG',1 ;CODE 1 = ASK HIM UNLESS MESSAG IS SET
XWD 'MSG',2 ;CODE 2 TYPE, EXCEPT IF /, TYPE ONLY NEW, ∂ HACK
XWD 'MSG',1 ;PPN MESSAGE.
XWD 'NAP',6 ;MESSAGE FROM AP SYSTEM.
XWD 'TXT',2 ;FILE EXTENSION,,DECISION CODE
XWD 'DAY',10;TODAY EVENTS
XWD 'DAY',10;TOMORROW EVENTS
XWD 'DAY',10;MONDAY'S EVENTS IF TODAY IS FRIDAY
XWD 'TXT',0 ;CODE 0 = TYPE IF , OR / AND NEW
XWD 'TXT',0 ;
XWD 'TXT',3 ;
XWD 0,7 ;CODE 7 SEND MESSAGE ONLY IF NEW AND DIGEST REQUESTED.
MONTHT: SIXBIT/JAN/
SIXBIT/FEB/
SIXBIT/MAR/
SIXBIT/APR/
SIXBIT/MAY/
SIXBIT/JUN/
SIXBIT/JUL/
SIXBIT/AUG/
SIXBIT/SEP/
SIXBIT/OCT/
SIXBIT/NOV/
SIXBIT/DEC/
SDEF(MONTLG,.-MONTHT) ;LENGTH OF MONTH TABLE
GOODGY: 'REG' ; GORIN
'TED' ; PANOFSKY
'JOE' ; ZINGHIEM
'SYS' ; SYSTEM SOURCE FILES
'EHS' ; STUART
'ELM' ; MCGUIRE
'JBR' ; RUBIN
' BH' ; HARVEY
' ME' ; FROSTY
'SGK' ; KUGELL
SDEF(GOODTL,.-GOODGY) ;LENGTH OF GOODGUY TABLE
SDEF(FILBLK,2) ;NUMBER OF BLOCKS OF THE FILE TO READ
;WARNING!!! FILBLK MUST BE AT LEAST 2.
SDEF(FILENG,FILBLK*200) ;NUMBER OF WORDS TO READ
INRD: 'GODMOD' ;FOR MTAPE TO READ INFO AREA
1 ;READ
IOWD 40,FILE0 ;IOWD FOR TRANSFER
INRD1: 0 ;XWD RECORD,TRACK NUMBER
RDINFO: 'GODMOD' ;READ RETRIEVAL INFO
10
INFOS
WRINFO: 'GODMOD' ;WRITE RETRIEVAL INFO
11
INFOS
DEBUG: 0
DSKBUF: BLOCK 3 ;BUFFER HEADER
TTYOBF: BLOCK 3 ;BUFFER HEADER FOR CHANNEL "TTY"
LZAP: ;FIRST LOC ZEROED AT START OF LOGIN
TTYBUF: 0 ;ADDRESS OF BUFFERS FOR USER CONSOLE
DISKBF: 0 ;PLACE TO PUT DISK BUFFERS
NOW: 0 ;SET TO DATE,,TIME IN MINUTES WHEN STARTED
DBLOCK:
USER: 0 ;USERS PPN
USRBIT: 0 ;USER PRIVILEGE BITS
SDEF(LBLEN,.-DBLOCK)
UFDLOK: BLOCK 5 ;4 WORDS FOR UFD RENAME BLOCK, 5TH FOR FLAG
PDLIST: BLOCK PDLEN ;PUSH DOWN LIST
GOTUFD: 0 ;HAS USER ALREADY GOT A UFD?
INFOS: BLOCK INFON
PHRASE: BLOCK 2 ;PROJECT/WD 1, PROGRAMMER/WD 2.
MFDPT: 0
SFLAG: 0
LPTBUF: 0
SLREQ: 0 ;USER REQUEST FOR SERVICE LEVEL
RSL: 0
CSL: 0
BUF: ;THIS IS A PUN. USED FOR READING LOG.LOG
FILE0: BLOCK 40 ;BLOCK FOR THE RETRIEVAL
FILE: BLOCK FILENG ;BLOCK FOR FIRST BLOCK OF FILE
MUDPTR: BLOCK 2
NOTEON: 0 ;SET TO -1 WHILE PROCESSING NOTICE.TXT
DFAKE: 0 ;SET TO -1 IF FAKING DISK BY ABS READS
COOKIE: 0 ;COUNT NUMBER OF CHARACTERS BEFORE COOKIES
;WHEN <0 MEANS YOU HAVE TO TURN ON THE OVEN
COOKON: 0 ;SET IF MAKING COOKIE THING
CDONE: 0 ;SET TO -1 WHEN COOKIES ARE COOLING
DAY: 0
MONTH: 0
YEAR: 0
TIME: 0
MESDAY: 0 ;SAVE P-P DELIMITER
FILLCH: 0
BASECH: 0
RAD: TZAP: 0 ;RADIX FOR ALLRAD PRINTER.
; TZAP IS LAST WORD ZEROED BY BLT AT START
LASLOG: 0
DAYTAB: ASCIZ /Sunday/
ASCIZ /Monday/
ASCIZ /Tuesday/
ASCIZ /Wednesday/
ASCIZ /Thursday/
ASCIZ /Friday/
ASCIZ /Saturday/
CKCODE: -1 ;SET TO ZERO IF LOSER IS NOT AUTHORIZED.
IFN NETGUE,<
NGNMUU: 'WHO',,0 ;TMPCOR ARG FOR NETGUE'S REAL NAME
IOWD 0,NGNMBF
NGNMBF: BLOCK NGNMWD ;NAME GOES HERE
>
PATCH: BLOCK 20
PATCH1: BLOCK 20
PATCH2: BLOCK 20
JOBQUE: 0
JBTSTS: 0
JOBN: 0
SVSTAT: 0
LINCHR: 0 ;TTY LINE CHARACTERISTICS WORD
PTYTJB: 0 ;JOB NUMBER OF CONTROLLER IF THIS IS A PTY.
PTYPPN: 0 ;PPN OF CONTROLLING JOB FOR PTY LINES.
CHTEMP: 0
TYIBUF: BLOCK 50 ;BUFFER FOR SPECIAL HACK MODE
SUBTTL ALARUMS AND DIVERSIONS
NODISK: OUTSTR NODSKM
EXIT
NOCORE: OUTSTR [ASCIZ/Core uuo failed!
/]
EXIT
UFDEER: OUTSTR [ASCIZ/Can't make your new ufd
/]
EXIT
UFDLER: OUTSTR [ASCIZ/UFD Lookup failed. /]
CAIL B,UERRTL
MOVEI B,0 ;LOSER LOSER
OUTSTR @UERRTB(B) ;GIVE MESSAGE FROM TABLE
OUTSTR CRLF
EXIT
UERRTB: [ASCIZ/UNKNOWN STATUS/]
[ASCIZ/ILLEGAL PPN/]
[ASCIZ/PROTECTION/]
[ASCIZ/RENAME ERROR/]
[ASCIZ/RENAME ERROR/]
[ASCIZ/RENAME ERROR/]
[ASCIZ/NAMES CONFLICT/]
[ASCIZ/NO INIT/]
[ASCIZ/BAD MFD ENTRY/]
[ASCIZ/UFD GARBAGED/]
SDEF(UERRTL,.-UERRTB)
NOUFD: OUTSTR [ASCIZ/I CAN'T FIND THE UFD THAT I JUST MADE FOR YOU!
/]
EXIT
SUBTTL VARIOUS FLAVORS OF OUTPUT STUFF
; OUTPUT ROUTINES. ALL ROUTINES USE PUTCHR TO TYPE
; ONE CHARACTER ON CHANNEL TTY. THIS CHANNEL IS INITIALLY
; THE USER CONSOLE, BUT MAY BE SWITCHED TO THE LPT
; FOR THE L COMMAND FROM [1,2] USER MODE.
LPTRLS: SKIPN A,LPTBUF ;ASSUME LPT BUFFER IS AT HIGH CORE
POPJ P, ;NO BUFFERS-NO RELEASE
MOVEM A,JOBFF ;RECLAIM THE SPACE
CLOSE TTY, ;FORCE OUT ALL THE DATA
SETZM LPTBUF ;ZERO THE BUFFER POINTER
TTYINI: INIT TTY,0 ;GET THE TTY
'TTY ' ;USER CONSOLE
XWD TTYOBF,0 ;OUTPUT ONLY
JRST NOTTY ;THIS CAN'T HAPPEN
SKIPN A,TTYBUF ;DID WE HAVE BUFFERS ONCE BEFORE?
JRST TTYIN1 ;NOPE. MAKE NEW ONES
EXCH A,JOBFF ;YES RESET JOBFF
OUTBUF TTY,2 ;RESET THE OLD BUFFERS
MOVEM A,JOBFF ;RESTORE JOBFF
POPJ P, ;ALL DONE
TTYIN1: MOVE A,JOBFF ;GET JOBFF
MOVEM A,TTYBUF
OUTBUF TTY,2 ;GET SOME BUFFERS
POPJ P, ;RETURN
LPTINI: INIT TTY,0 ;GET THE LPT ON CHANNEL NAMED TTY
'LPT '
XWD TTYOBF,0
JRST LPTIN1 ;NO LPT AVAILABLE
MOVE A,JOBFF ;GET THE PRESENT JOBFF
MOVEM A,LPTBUF ;SAVE AS ADDRESS OF THE LPT BUFFER
OUTBUF TTY,2 ;GET SOME BUFFERS
JRST CPOPJ1 ;SKIP RETURN
LPTIN1: OUTSTR [ASCIZ/LPT IS NOT AVAILABLE.
/]
POPJ P, ;RETURN
PUTCHR: SKIPN LPTBUF ;ONLY DO IT THE HARD WAY FOR LPT
JRST PUTCH2
SOSG TTYOBF+2 ;DECREMENT CHARACTER COUNT
OUTPUT TTY, ;WRITE A BUFFER
IDPB A,TTYOBF+1 ;DEPOSIT CHARACTER IN BUFFER
POPJ P,
PUTCH2: TTCALL 1,A ;WRITE ONE CHARACTER
POPJ P,
PUTSTR: HRLI B,440700 ;7 BIT BYTE POINTER IN B
PUTST1: ILDB A,B ;LOAD A BYTE
JUMPE A,CPOPJ ;RETURN IF NULL
PUSHJ P,PUTCHR ;WRITE CHARACTER
JRST PUTST1 ;LOOP
DECOUT: SKIPA B,[12] ;THE BASE
OCTOUT: MOVEI B,10 ;BASE FOR OCTAL
MOVEM B,RAD
SETZ TAC,
MOVEI B,"0"
MOVEM B,BASECH ;SAVE BASE CHARACTER
ALLRAD: IDIV A,RAD ;DIVIDE BY THE RADIX
HRLM B,(P) ;SAVE REMAINDER
SUBI TAC,1 ;DECREMENT THE CHARACTER COUNT
JUMPE A,ALLRD1 ;JUMP IF DEEP ENOUGH
PUSHJ P,ALLRAD ;NO. MAKE A RECURSIVE CALL
JRST ALLRD3 ;BUBBLE UP FROM RECURSION
ALLRD1: MOVE A,FILLCH ;GET THE FILL CHARACTER
ALLRD2: SOJL TAC,ALLRD3 ;ALL DONE WITH FILL?
PUSHJ P,PUTCHR ;NO. WRITE ONE CHARACTER
JRST ALLRD2 ;LOOP
ALLRD3: HLRZ A,(P)
ADD A,BASECH ;ADD THE BASE CHARACTER
JRST PUTCHR ;WRITE A CHARACTER AND POPJ.
TWODIG: MOVEI B,12
MOVEM B,RAD
MOVEI TAC,2
MOVEI B,"0"
MOVEM B,FILLCH
MOVEM B,BASECH
JRST ALLRAD
SIXOUT: MOVE TAC1,A ;GET THE SIXBIT INTO TAC1
SIXOU1: JUMPE TAC1,CPOPJ ;RETURN IF ALL DONE
SETZ TAC, ;ZERO IN TAC
LSHC TAC,6 ;MOVE CH. INTO TAC
MOVEI A," "(TAC) ;MAKE CHARACTER IN A
PUSHJ P,PUTCHR
JRST SIXOU1 ;LOOP
TYFIL: PUSHJ P,SIXOUT ;TYPE FILE NAME FROM A
HLLZ B,B ;GET THE EXTENSION
JUMPE B,CPOPJ ;NO EXTENSION
MOVEI A,"."
PUSHJ P,PUTCHR
MOVE A,B
JRST SIXOUT ;WRITE MORE
TYPPN: HRLZ B,A ;GET THE PROG
PUSH P,B ;SAVE
HLLZ B,A ;GET THE PROJ
MOVEI A,"["
PUSHJ P,PUTCHR
MOVE A,B
PUSHJ P,SIXOUT
MOVEI A,","
PUSHJ P,PUTCHR
POP P,A
PUSHJ P,SIXOUT
MOVEI A,"]"
JRST PUTCHR
TDOUT: JUMPE A,TDOUTX ;JUMP IF NO ENTRY HERE
HLRZ B,A ;GET THE DATE
HRRZ A,A ;GET THE TIME
PUSH P,A ;SAVE TIME
IDIVI B,37 ;GET THE DAY IN C
MOVEI A,1(C) ;SAVE DAY OF MONTH
IDIVI B,14 ;GET MONTH IN C
ADDI B,100
MOVEM B,YEAR ;SAVE YEAR
PUSHJ P,DECOUT ;WRITE DECIMAL
MOVEI A,"-" ;WRITE -
PUSHJ P,PUTCHR
MOVE A,MONTHT(C) ;GET THE NAME OF MONTH
PUSHJ P,SIXOUT
MOVEI A,"-"
PUSHJ P,PUTCHR
MOVE A,YEAR
PUSHJ P,DECOUT
MOVEI A,11
PUSHJ P,PUTCHR
POP P,A
IDIVI A,74 ;HOURS IN A,MINUTES IN B
PUSH P,B
PUSHJ P,TWODIG
POP P,A
JRST TWODIG ;WRITE TWO MORE AND RETURN
TDOUTX: MOVEI A,11 ;GET A TAB
PUSHJ P,PUTCHR ;WRITE ONE
JRST PUTCHR ;WRITE TWO
LOGON: TRNE FL,PTYLIN
POPJ P, ;NOTHING FOR PTY'S
HLRZ A,NOW ;GET THE CURRENT DATE
IDIVI A,37
MOVEI D,1(B) ;GET DAY OF MONTH IN D
IDIVI A,14 ;YEAR IN A, MONTH IN B
TRNN A,3 ;SKIP IF NOT LEAP YEAR
CAIGE B,2 ;SKIP IF AFTER FEBRUARY ON LEAP YEAR
SUBI D,1 ;NOT LEAP YEAR & PAST FEB. SUBTRACT 1
ADDI A,3 ;JAN 1, 1964 WAS A WEDNESDAY
ADD D,A
LSH A,-2 ;DIV BY 4 MAKE # OF LEAP YEARS SINCE JAN 64
ADD A,D ;BASE FOR THIS DAY AND YEAR
MOVE D,[033614625035];MONTH OFFSET WORD
ROT D,1(B)
ROT D,1(B)
ROT D,1(B)
ANDI D,7
ADD A,D
IDIVI A,7
LSH B,1 ;DOUBLE THE INDEX VALUE
OUTSTR DAYTAB(B)
OUTSTR [ASCIZ/ /] ;TYPE A TAB
MOVE A,NOW
PUSHJ P,TDOUT ;TYPE IT
MOVEI B,CRLF
PUSHJ P,PUTSTR
CLOSE TTY, ;FORCE IT OUT
POPJ P, ;RETURN
OCTIN0: OUTSTR [ASCIZ/ILLEGAL CHARACTER IN OCTAL SCAN. PLEASE TRY AGAIN
/]
OCTIN: SETZB A,C ;CLEAR SUCCESS FLAG, ACCUMULATOR
OCTIN1: INCHWL B
CAIN B,15
JRST OCTIN1
CAIN B,12
POPJ P, ;C>0 IF ANYTHING SEEN
JUMPL C,OCTIN0 ;ONLY CRLF ALLOWED AFTER ?
JUMPG C,OCTIN2 ;? NOT ALLOWED AFTER DIGIT
CAIN B,"?"
SOJA C,OCTIN1 ;C<0 FOR HELP REQUEST
OCTIN2: CAIL B,"0"
CAILE B,"7"
JRST OCTIN0 ;ERROR
LSH A,3
ADDI A,-"0"(B)
AOJA C,OCTIN1 ;LOOP
SUBTTL IF THE USER IS LOGGED IN ALREADY
USRMOD: SETOB A,SFLAG
SETPRV A, ;ASK ABOUT OUR PRIVILEGES
TLNN A,INFPRV ;HAVE WE GOT THE PRIVILEGE?
TDZA B,B ;NO.
MOVEI B,URCON ;YES.
GETPPN A,
MOVEM A,USER ;SIMULATE MESSAGES FOR CURRENT USER
SETZM MESDAY
MOVEM B,124 ;SET REENTRY POINT
JRST URCON
UEXIT: SETOM GUGGLE
MOVE A,[GUGGLE,,GUGGLE+1]
BLT A,ZATCH
EXIT ;NO PASSWORD: CALL EXIT
URCON: RELEAS TTY,3 ;SUPPRESS TTY IO CLOSE
PUSHJ P,PASINI ;INITIALIZE THE PASSWORDS
OUTSTR [ASCIZ/Master /]
MOVE W,ONEPAS ;GET THE SPECIAL PASSWORD
PUSHJ P,PASSGO ;SEEK A PASSWORD
JRST UEXIT
SETZM LPTBUF
PUSHJ P,TTYINI
UCON: PUSHJ P,RMFD ;READ THE MFD
UCMSG: OUTSTR [ASCIZ/
E EXIT
M MODIFY
F FIND USERS
P PRIVILEGE NAMES
/]
SKIPE JOBDDT
OUTSTR [ASCIZ/$ DDT
/]
UC: OUTSTR [ASCIZ/*/]
INCHWL A
CLRBFI
CAIL A,"a"
CAILE A,"z"
JRST .+2
TRZ A,40
MOVSI B,-UCTL
HLRZ C,UCT(B)
CAME A,C
AOBJN B,.-2
JUMPL B,UC1
OUTSTR [ASCIZ/?
/]
JRST UC
UC1: HRRZ C,UCT(B)
PUSHJ P,(C)
JRST UC
UCT: XWD "E",UEXIT
XWD 12,CPOPJ
XWD 15,CPOPJ
XWD "F",FIND
XWD "M",MODIFY
XWD "$",DDTGO
XWD 175,DDTGO
XWD "H",UCTYPE
XWD "P",PTYPE ;TYPE PRIVILEGE NAMES
XWD "T",ITYPE ;TYPE STUFF
XWD "L",ILIST ;LIST STUFF
SDEF(UCTL,.-UCT)
DDTGO: SKIPN JOBDDT
JRST NODDT
OUTSTR [ASCIZ/(DDT)
/]
JRST @JOBDDT
UCTYPE: POP P,(P)
JRST UCMSG
NODDT: OUTSTR [ASCIZ/NO DDT
/]
POPJ P,
SUBTTL FIND
FIND: OUTSTR [ASCIZ/USER = /]
PUSHJ P,SIXIN ;GET SOME SIXBIT
HRRZM B,PHRASE ;SAVE PART 1
CAIN A,"," ;MUST SEE A COMMA
JRST FIND0 ;COMMA
CAIE A,12 ;NOT COMMA: NEED LF
JRST FNDERR ;I DON'T UNDERSTAND
JRST FIND0A ;OK, B WILL BE USER NAME
FIND0: PUSHJ P,SIXIN ;GET ANOTHER
HRL B,PHRASE ;GET THE OTHER PART
FIND0A: MOVEM B,USER
CAIE A,12
JRST FNDERR
MOVE D,MFDPT
AOJGE D,CPOPJ
PUSH P,LPTBUF
SETOM LPTBUF
FIND1: SKIPN A,USER ;LOAD THE MASK
JRST FIND2 ;ZERO MASK: TYPE ANYTHING
MOVE B,0(D) ;MASK ∧ ¬ NAME
TRNN A,-1 ;SKIP IF PROG NAMED
TRZ B,-1 ;NO PROG NAMED. SET PROG TO 0
TLNN A,-1
TLZ B,-1
CAMN A,B
FIND2: PUSHJ P,TYPEX ;TYPE USER NAME
ADD D,[XWD UFDN,UFDN]
JUMPL D,FIND1
CLOSE TTY, ;FLUSH OUTPUT
POP P,LPTBUF ;RESTORE OLD BUFFER POINTER
POPJ P,
FNDERR: OUTSTR [ASCIZ/INVALID ITEM
/]
CLRBFI
POPJ P,
SUBTTL THINK ABOUT PRIVILEGES
PRVTYP: PUSH P,A ;SAVE THE PR BITS
MOVEI A,11 ;WRITE A TAB
PUSHJ P,PUTCHR ;..
HLLZ L,0(P) ;GET THE PR BITS (LEFT)
MOVSI M,-LPBLL ;GET THE LENGTH OF THE TABLE
JUMPE M,PRVTP3 ;JUMP IF NO LEFT SIDE BITS
PRVTP1: TDNN L,LPBITS(M) ;SEE IF A BIT IS SET
JRST PRVTP2 ;NOPE
HRLZ A,LPBITS(M) ;GET THE PRIV NAME
PUSHJ P,SIXOUT ;TYPE SIXBIT
MOVEI A," "
PUSHJ P,PUTCHR ;WRITE A SPACE
PRVTP2: AOBJN M,PRVTP1 ;LOOP
PRVTP3: POP P,L ;GET THE BITS BACK
HRLZ L,L ;GET THE RIGHT SIDE BITS IN THE LEFT
MOVSI M,-RPBLL
JUMPE M,CPOPJ
PRVTP4: TDNN L,RPBITS(M)
JRST PRVTP5
HRLZ A,RPBITS(M)
PUSHJ P,SIXOUT
MOVEI A," "
PUSHJ P,PUTCHR
PRVTP5: AOBJN M,PRVTP4
POPJ P,
PRVGET: MOVEM A,PHRASE+1 ;SAVE OLD PRIV. SET
MOVEM A,PHRASE ;SAVE HERE TOO
JUMPE A,PRVGT0 ;ASK FOR NEW PRIVS
OUTSTR [ASCIZ/ADDED/]
JRST .+2
PRVGT0: OUTSTR [ASCIZ/NEW/]
OUTSTR [ASCIZ/ PRIVILEGES: /]
PRVGT1: PUSHJ P,SIXIN ;GET SOME SIXBIT NAME IN B
MOVEM A,MESDAY ;SAVE THE DELIMITER IN MESDAY
MOVSI M,-LPBLL
JUMPE M,PRVGT3 ;NO FLAGS ON THIS SIDE?
JUMPE B,PRVGT7 ;FLUSH NULL STRINGS
PRVGT2: HRRZ A,LPBITS(M) ;GET THE NAME OF A PRIVILEGE
CAME A,B ;COMPARE TO WHAT WE SAW
AOBJN M,PRVGT2
JUMPGE M,PRVGT3
HLLZ A,LPBITS(M) ;GET THE BITS
JRST PRVGT5 ;SET NEW BITS
PRVGT3: MOVSI M,-RPBLL
JUMPE M,PRVGT6 ;THIS IS A LOSS
PRVGT4: HRRZ A,RPBITS(M)
CAME A,B
AOBJN M,PRVGT4
JUMPGE M,PRVGT6
HLRZ A,RPBITS(M) ;GET THE BIT TO SET
PRVGT5: TRNN FL,NEGF
IORM A,PHRASE+1
TRNE FL,NEGF
ANDCAM A,PHRASE+1 ;SHUT OFF BITS
JRST PRVGT7 ;LOOK FOR MORE
PRVGT6: OUTSTR [ASCIZ/UNKNOWN: /]
HRLZ A,B ;GET THE OFFENSIVE NAME
PUSHJ P,SIXOUT ;WRITE IT
OUTSTR CRLF
PRVGT7: MOVE A,MESDAY
CAIE A,12 ;LF STOPS THE WORLD
JRST PRVGT1 ;LOOK FOR MORE
MOVE A,PHRASE+1
MOVEM A,INFOS+PRVBIT ;SAVE IN INFOS
POPJ P, ;RETURN
SIXIN: SETZ B, ;ZERO AN AC
TRZA FL,NEGF ;ZERO FLAG FOR -
SIXIN0: TRC FL,NEGF ;SET FLAG
SIXIN1: INCHWL A ;GET A CHARACTER
CAIN A,15
JRST SIXIN1 ;FLUSH CR
CAIE A,40
CAIN A,11
JRST [JUMPE B,SIXIN1 ;IGNORE LEADING BLANKS AND TAB
POPJ P,] ;ELSE RETURN
CAIE A,","
CAIN A,12
POPJ P, ;RETURN FOR LF OR COMMA
CAIN A,"-"
JUMPE B,SIXIN0
CAIL A,"a"
CAILE A,"z"
JRST .+2
TRZ A,40
CAIG A,40
POPJ P, ;RETURN
SUBI A,40
ANDI A,77
TLNE B,770000 ;ANY BITS LEFT IN B?
JRST SIXIN1 ;NOPE FLUSH EXTRA CHARACTERS
LSH B,6
IOR B,A
JRST SIXIN1 ;LOOP
PROTYP: TDNN A,[777400,,000000] ;IF ANY OF THESE ARE ON, TYPE SOMETHING
POPJ P,
MOVEI B,[ASCIZ/ Default protection = /]
PUSH P,A ;SAVE THE WORD
PUSHJ P,PUTSTR
LDB A,[POINT 9,(P),8] ;GET PROTECTION.
PUSHJ P,OCTTYP ;TYPE OCTAL
MOVEI A,11
PUSHJ P,PUTCHR
MOVE A,(P)
TLNN A,400 ;THIS IS INELEGANT, BUT I DON'T REALLY WANT TO
JRST PRORET ;THINK ABOUT IT TOO HARD
MOVEI B,[ASCIZ/
400 Remote Account/]
PUSHJ P,PUTSTR
PRORET: MOVEI B,CRLF
PUSHJ P,PUTSTR
POP P,A
POPJ P,
PROGET: OUTSTR [ASCIZ/New default protection halfword: /]
MOVEI B,0
PROGT1: INCHWL A ;GET A CHARACTER
CAIN A,15
JRST PROGT1 ;FLUSH CR
CAIE A,40
CAIN A,11
JRST [JUMPE B,PROGT1 ;IGNORE LEADING BLANKS AND TAB
POPJ P,] ;ELSE RETURN
CAIL A,"0"
CAILE A,"7"
POPJ P,
LSH B,3
IORI B,-"0"(A)
JRST PROGT1
PTYPE: TTCALL 3,[ASCIZ/The available privileges are:
/]
SETO A,
PUSHJ P,PRVTYP ;TYPE ALL BITS
PRONAM: OUTSTR [ASCIZ/
The fields in the default protection word (LH) are:
777000 default proection for new files
000400 Remote account
/]
POPJ P,
OCTTYP: IDIVI A,10
HRLM B,(P)
JUMPE A,.+2
PUSHJ P,OCTTYP
HLRZ A,(P)
ADDI A,"0"
JRST PUTCHR
SUBTTL GET
XLIST
;THE ABOVE SUBTITLE IS MISLEADING
COMMENT $
THE FOLLOWING DEFINITIONS HAVE BEEN XLISTED TO WHET YOUR CURIOUSITY:
MPASS: THE MAINTENANCE TIME PASSWORD
CPASS: THE CTY PASSWORD
$
SDEF(GUGGLE,.)
XLIST
MPASS: 'FEEPER' ;MAINTENCE TIME PASSWORD FOR ALIASES
CPASS: 'FEEPER' ;CTY PASSWORD FOR ALIASES
NODSKM: ASCIZ /CAN'T INIT THE DISK
/
ONEPAS: 0 ;REMEMBER PASSWORD OF 1,1 HERE.
SDEF(ZATCH,.-1) ;ZERO FROM YOUR GUGGLE TO YOUR ZATCH BEFORE LOGIN UUO
LIST
SUBTTL LIST USER DATUM.
ILIST: PUSHJ P,LPTINI ;GET THE LPT.
POPJ P, ;NOT THERE
GETPPN A,
PUSHJ P,TYPPN
MOVEI B,[ASCIZ/ requested this listing
/]
PUSHJ P,PUTSTR
ITYPE: MOVE D,MFDPT
AOJGE D,LPTRLS
ILIST1: PUSHJ P,TYPEX ;CALL TYPE OUT ROUTINES
ADD D,[XWD UFDN,UFDN]
JUMPL D,ILIST1
JRST LPTRLS ;RELEASE THE LPT IF IN USE
TYPEX: SKIPE B,0(D) ;IS THERE A PPN HERE?
CAMN B,[' 1 1']
POPJ P, ;NO. RETURN
HLRZ B,1(D) ;MAKE SURE OF VAILD UFD
CAIE B,'UFD'
POPJ P, ;NOT VALID
HRRZ B,3(D) ;GET THE DISK ADDRESS
MOVEM B,INRD1 ;SAVE
PUSHJ P,DOINRD ;READ THE DISK
JRST ILIST5 ;ERROR
MOVE B,[XWD FILE0+INFBAS,INFOS]
BLT B,INFOS+4 ;BLT SPECIAL RETRIEVAL DATA
SKIPN INFOS+LOSPSW ;SKIP IF HE'S GOT PASSWORD
SKIPE LPTBUF ;NO PASSWORD. SKIP IF TTY
JRST ILIST4 ;PASSWORD OR LPT. WRITE IT
SKIPN INFOS+PRVBIT ;SKIP IF HE HAS PRIV BITS
POPJ P, ;TTY AND NO PASSWORD. SKIP THIS
ILIST4: MOVE A,0(D)
PUSHJ P,TYPPN ;WRITE NAME
MOVEI A,11
PUSHJ P,PUTCHR ;AND TAB
SKIPN A,INFOS+LOSPSW ;GET THE PASSWORD
JRST ILST4X ; IF ANY
PUSHJ P,SIXOUT ;WRITE
MOVEI A,"%"
SKIPGE 2(D) ;IF REMOTE-ONLY PASSWORD,
PUSHJ P,PUTCHR ; FLAG IT
ILST4X: SKIPN LPTBUF ;SKIP IF WE'RE ON THE LPT
JRST ILST4A ;ON THE TTY. SHORT MESSAGE
MOVEI A,11
PUSHJ P,PUTCHR ;WRITE A TAB
MOVE A,INFOS+LASDAT ;GET DATE AND TIME
TLZ A,400000 ;DELETE BIT
PUSHJ P,TDOUT ;WRITE TIME AND DATE
MOVEI A,"*"
SKIPGE INFOS+LASDAT
PUSHJ P,PUTCHR ;FLAG ILLEGAL USERS.
ILST4A: SKIPE A,INFOS+PRVBIT ;GET THE USER PRV BITS
PUSHJ P,PRVTYP ;TYPE PR BITS
MOVE A,INFOS+PRVBIT
ANDCM A,ALLPRV
JUMPE A,ILST4B ;JUMP IF NO MYSTERY PRIVS.
PUSH P,A
MOVEI B,[ASCIZ/UNKNOWN PRIVILEGES = /]
PUSHJ P,PUTSTR
POP P,A
PUSHJ P,OCTOUT
ILST4B: MOVEI B,CRLF
PUSHJ P,PUTSTR
MOVE A,INFOS+DEFPRO
JRST PROTYP ;TYPE PROTECTION DATA AND RETURN
ILIST5: MOVEI B,[ASCIZ/DISK ERROR READING UFD
/]
JRST PUTSTR ;WRITE STRING AND POPJ
SUBTTL MODIFY A USER'S INFO ENTRY
MODIFY: OUTSTR [ASCIZ/USER = /]
PUSHJ P,GETP
POPJ P,
SKIPE A,PHRASE+1
SKIPN PHRASE
JRST FNDERR ;MAKE ERROR MESSAGE
HRL A,PHRASE
MOVE D,MFDPT ;GET POINTER TO MFD
AOJL D,MODIF1 ;MAKE DIRECT POINTER
OUTSTR [ASCIZ/MFD IS EMPTY?
/]
POPJ P,
MODIF1: CAMN A,(D) ;LOOK
JRST MODIF3 ;FOUND ONE?
MODIF2: ADD D,[XWD UFDN,UFDN] ;FORGE ON
JUMPL D,MODIF1 ;LOOP
OUTSTR [ASCIZ/NO SUCH UFD.
/]
POPJ P,
MODIF3: HLRZ B,1(D)
CAIE B,'UFD'
JRST MODIF2 ;THIS IS NOT A UFD
CAMN A,[' 1 1']
POPJ P,
PUSH P,D ;SAVE POINTER TO UFD
HRRZ B,3(D) ;GET THE TRACK ADDRESS
MOVEM B,INRD1 ;SAVE
PUSHJ P,DOINRD ;READ RETRIEVAL
JRST ILIST5 ;ERROR
MOVE A,[XWD FILE0+INFBAS,INFOS]
BLT A,INFOS+INFON-1 ;GET THE DATA TO A CONVENIENT PLACE
PUSHJ P,MTYPE ;TYPE DATA FOR THIS GUY.
OUTSTR [ASCIZ/NEW PASSWORD = /]
PUSHJ P,GETP ;GET A PASSWORD
SETZM PHRASE ;NULL PASSWORD
MOVE A,PHRASE ;GET IT
MOVEM A,INFOS+LOSPSW ;SAVE IT
MOVE A,INFOS+PRVBIT ;GET PRIVILEGES
PUSHJ P,PRVGET ;GET A NEW SET OF PRIVILEGES
PUSHJ P,PROGET ;GET NEW PROTECTION BITS
MOVSM B,INFOS+DEFPRO ;SAVE NEW PROTECTION BITS IN LH
MOVE D,(P)
OUTSTR [ASCIZ/
DATA FOR THIS USER IS NOW:
/]
PUSHJ P,MTYPE
POP P,D ;GET D BACK AGAIN
OUTSTR [ASCIZ/WRITE THIS NOW? /]
PUSHJ P,YORN
POPJ P, ;NO
MOVE K,(D) ;GET USER NAME
MOVSI L,'UFD'
SETZ M,
MOVE N,GOD
LOOKUP DMP,K
JRST MODIF4 ;CAN'T ENTER
; SETZM INFOS+LASDAT+1
; MOVE K,[XWD INFOS+LASDAT+1,INFOS+LASDAT+2]
; BLT K,INFOS+INFON-1
MTAPE DMP,WRINFO ;WRITE DATA INTO FILE
JRST MODIF5 ;ERROR
CLOSE DMP, ;RELEASE FILE
POPJ P,
MODIF4: OUTSTR [ASCIZ/
UFD LOOKUP FAILED
/]
POPJ P,
MODIF5: CLOSE DMP,
OUTSTR [ASCIZ/INFO WRITE FAILED
/]
POPJ P,
MTYPE: MOVE A,(D) ;GET THE PPN
PUSHJ P,TYPPN
MOVEI A,11
PUSHJ P,PUTCHR
SKIPN A,INFOS+LOSPSW
JRST MTYPE1
PUSHJ P,SIXOUT
MOVEI A,"%"
SKIPGE 2(D)
PUSHJ P,PUTCHR
MTYPE1: SKIPE A,INFOS+PRVBIT
PUSHJ P,PRVTYP
MOVEI B,CRLF
JRST PUTSTR
MOVE A,INFOS+DEFPRO
PUSHJ P,PROTYP ;TYPE PROTECTION PART
MOVEI B,CRLF
JRST PUTSTR
DOINRD: MTAPE DMP,INRD ;READ RETRIEVAL
POPJ P, ;ERROR
AOS (P)
MOVEM A,1(P)
HRRZ A,(D) ;GET USER NAME
; CAIE A,'REG' ;SPECIAL?
JRST DOINR0 ;YES.
DOINR1: SKIPE A,FILE0+LOSPSW+INFBAS
MOVE A,['QRALPH']
MOVEM A,FILE0+LOSPSW+INFBAS
DOINR0: MOVE A,1(P) ;GET DATA BACK
POPJ P,
SUBTTL READ UFD
RMFD: MOVE A,GOD
MOVSI B,'UFD'
SETZ C,
MOVE D,GOD
MOVEI W,UFDN
ADDM W,JOBFF ;INCREMENT JOBFF TO LEAVE SOME ROOM
PUSHJ P,DREAD
EXIT ;THIS BETTER NOT HAPPEN. EVER
SUB W,[XWD UFDN,UFDN]
MOVEM W,MFDPT ;SAVE POINTER TO MFD
MOVE A,GOD
MOVSI B,'UFD'
SETZ C,
MOVEI D,MFDTRK ;1 IS THE TRACK ADDRESS OF MFD
MOVEI X,1(W)
HRLI X,A ;SOURCE,,DESTINATION IN X
BLT X,4(W) ;SAVE THE STUFF
POPJ P, ;RETURN
SUBTTL DREAD READ A WHOLE FILE IN DUMP MODE.
; SET A,B,C,D TO A LOOKUP BLOCK.
; SKIP RETURN IF OK. W IS IOWD FOR DATA. FILE READ INTO JOBFF
; NON SKIP: MESSAGE WILL BE TYPED
DREAD: SETZB W,X ;ZERO THINGS TO START RIGHT
LOOKUP DMP,A ;LOOK FOR THE FILE
JRST DREAD1 ;FILE NOT FOUND. CODE IN B
HRR D,JOBFF ;GET JOBFF
SUBI D,1 ;MAKE THIS AN IOWD
MOVE W,D ;SAVE THE IOWD
HLRE C,D ;GET - LENGTH OF FILE
MOVN B,C ;GET + FILE LENGTH
ADDB B,JOBFF ;RESET JOBFF
CAMG B,JOBREL ;IS IT TOO BIG?
JRST .+3 ;NO. WE'RE OK
CORE B, ;MAKE ENOUGH CORE HAPPEN
JRST NOCORE ;THIS IS A LOSS
INPUT DMP,W ;USE THE IOWD IN W TO READ THE WHOLE
STATZ DMP,740000 ;CHECK TRANSFER STATUS
JRST DREAD2 ;LOSING STATUS
CLOSE DMP, ;RELEASE THE FILE
JRST CPOPJ1 ;GIVE THE OK RETURN
DREAD1: CAME A,['ALFACT'] ;NO MESSAGE IF ACCOUNTING LOSES.
TRNE FL,PTYLIN
JRST DREAD4
OUTSTR [ASCIZ/LOOKUP FAILURE. FILE = /]
PUSH P,A
PUSH P,B ;SAVE FILE AND CODE
PUSHJ P,TYFIL ;WRITE FILE NAME
OUTSTR [ASCIZ/; CODE = /]
HRRZ A,(P) ;GET FROM STACK
JRST DREAD3
DREAD2: TRNE FL,PTYLIN
JRST DREAD4
OUTSTR [ASCIZ/I-O ERROR. FILE = /]
PUSH P,A
PUSH P,B
PUSHJ P,TYFIL
OUTSTR [ASCIZ/; STATUS = /]
GETSTS DMP,A
DREAD3: PUSHJ P,OCTOUT
OUTSTR CRLF
POP P,B
POP P,A
DREAD4: CLOSE DMP,
POPJ P,
SUBTTL LOGIN: INITIALIZE AND DO THE LOGIN
BEGIN: TDZA FL,FL
MOVEI FL,1 ;SIGNIFY SPECIAL START UP.
MOVEM FL,TYIBUF ;STORE SPECIAL HACK FLAG
RESET ;A GOOD WAY TO START THE DAY
MOVE P,[IOWD PDLEN,PDLIST] ;INITIALIZE PDL
SETZB FL,LZAP ;ZERO THE FIRST OF THE BLT AREA
MOVE A,[XWD LZAP,LZAP+1]
BLT A,TZAP ;ZERO TO TZAP
SETOM CKCODE ;ASSUME LEGITIMATE USER.
INIT DMP,217 ;GET A DISK CHANNEL FOR USE LATER
'DSK '
0
JRST NODISK ;THIS IS TERRIBLE
PUSHJ P,TTYINI ;GET A TTY
DATE A, ;GET CURRENT DATE
TIMER B, ;AND TIME IN TICKS SINCE MIDNITE
IDIVI B,74*74 ;DIVIDE TICKS TO MAKE MINUTES
HRL B,A ;MAKE DATE,,TIME
MOVEM B,NOW ;SAVE TIME
IDIVI A,14*37 ;YEARS IN A, DAY OF YEAR IN B
CAIN B,3*37 ;IS THIS APRIL 1?
TRO FL,FOOLS ;YES. HAVOC!
SETO A, ;SET A TO GET LINE CHARACTERISTICS
TTCALL 6,A ;GET LINE CHARACTERISTICS
MOVEM A,LINCHR ;LINE CHARACTERISTICS WORD
TLNE A,DPYBIT+DDBIT ;EITHER DATA DISK OR III?
TRO FL,DPYLIN ;YES FLAG IT
TLNE A,CTYBIT ;CTY?
TRO FL,CTYLIN ;YES
TLNE A,PTYBIT
TROA FL,PTYLIN ;FLAG A PTY
JRST BEGNPT ;THIS IS NOT A PTY.
TLNE A,IMPBIT ;IS THIS AN IMP?
TRC FL,IMPLIN+PTYLIN ;YES. SET IMP AND NOT PTY.
MOVEI A,TTYNUM ;PEEK INTO SYSTEM
PEEK A,
LDB B,[POINT 9,A,8] ;
LDB C,[POINT 9,A,17];
ADDI B,1(C)
LDB C,[POINT 9,A,26]
ADDI B,(C)
HRRZ A,LINCHR
SUBI A,(B)
SETZM PTYPPN ;CLEAR PPN OF OWNER
SETZM PTYTJB
JUMPL A,BEGNPT ;THIS CAN'T HAPPEN?
MOVEI B,PTYJOB
PEEK B,
ADDI B,(A)
PEEK B,
MOVEM B,PTYTJB ;JOB NUMBER OF CONTROLLING JOB.
TLNE FL,IMPLIN ;IS THIS AN IMP ALREADY?
JRST BEGNPT ;YES. (PTYTJB IS SETUP)
GETPRV B, ;USER'S PRIVILEGES
TLNN B,1 ;LOCAL USER?
TRC FL,IMPLIN!PTYLIN ;NO TURN ON IMPLIN
MOVEI A,PRJPRG
PEEK A,
ADD A,PTYTJB
PEEK A,
MOVEM A,PTYPPN ;PPN OF PTY OWNER.
BEGNPT:
IFG REMTL,< ;COMPILE IF WE HAVE REMOTE LINE KLUGE
HRRZ A,LINCHR ;GET LINE NUMBER ONLY
MOVSI B,-REMTL ;LENGTH OF TABLE
CAMN A,REMOTE(B) ;IS THIS REMOTE?
TROA FL,IMPLIN ;YES TURN ON THE BIT AND SKIP
AOBJN B,.-2 ;NOT THIS ONE. LOOP.
>
MOVEI A,MAINTM ;GET THE ABS ADDRESS OF VECTOR
PEEK A, ;GET ABS ADDRESS OF CELL IN A
PEEK A, ;GET CONTENTS OF MAINTMODE IN A
JUMPE A,.+2 ;JUMP IF NO MAINTAINENCE
TRO FL,MAINT ;SIGNAL MAINTMODE
MOVEI A,NOLOGI
PEEK A,
PEEK A,
JUMPE A,.+2
TRO FL,NOTNOW ;SET FLAG FOR NO LOGINS NOW.
SKIPE DEBUG ;SKIP UNLESS DEBUGGING
JRST LOG.1 ;JUMP IF DEBUGGING
PJOB A, ;GET JOB NUMBER
JBTSTS A, ;GET JOB STATUS BITS
TLNE A,JLOG ;IS THIS JOB ACCOUNTING?
JRST USRMOD ;NO. RUN THE USER MODE PORTION
LOG.1: MOVSI A,LOGPRV ;LET US HAVE PRIVILEGES
SETPRV A, ;ASK SYSTEM TO LET US HAVE THEM
PUSHJ P,PASINI ;INITIALIZE PASSWORDS
MOVNI A,1
TTCALL 6,A
TLO A,10
TTCALL 7,A ;ASSUME NO HARDWARE TABS
SKIPE TYIBUF ;SKIP IF WE'RE IN SPECIAL HACK MODE.
JRST HACKR ;HACK READING ROUTINE
RESCAN D ;RESCAN THE LINE HE TYPED.
LOG.1A: SOJL D,LOGIN1 ;GOT ANY CHARACTERS LEFT?
INCHRS A ;GET A CHARACTER
MOVEI A,175
CAIE A,"L"
CAIN A,"l"
JRST LOG.2 ;HERE L IS SEEN
CAIE A," "
CAIN A,11
JRST LOG.1A ;IGNORE LEADING SPACE, TABS, FLUSH UNTIL "L"
JRST LOG.3 ;SOMETHING NOT AN L IS SEEN.
LOG.2: SOJL D,LOGIN1
INCHRW A
CAIE A,11
CAIN A," "
JRST LOG.4
JRST LOG.2
LOG.3: CAIN A,175 ;FLUSH ENTIRE RESCAN DATA
EXIT ;CALL EXIT
SOJL D,LOGIN1 ;ALL FLUSHED
INCHRS A ;GET ANOTHER
MOVEI A,175 ;SHOULDN'T HAPPEN (INVENT A REASON TO EXIT)
JRST LOG.3 ;FLUSH
LOG.4: TRO FL,RPGSW ;WE HAVE A LINE TO RESCAN
LOGIN1: MOVE P,[IOWD PDLEN,PDLIST] ;MAKE SURE STACK IS HAPPY
TRZ FL,NODATE ;MIGHT BE LEFT OVER FROM BAD.PPN
SETZM GOTUFD ;WE DO NOT YET KNOW IF HE HAS A UFD.
SETZM SLREQ ;NO SL ARGUMENT SEEN YET
TRNN FL,RPGSW ;DON'T DO SHARP IF RPG IS SET
OUTSTR [ASCIZ/#/] ;ACT READY TO GET PRJ-PRG.
PUSHJ P,GETP ;SCAN THE CRUFT THAT HE TYPES
JRST BADPPN ;THIS IS A LOSER
TRZ FL,RPGSW ;NO MORE RPG
SKIPE PHRASE
SKIPN PHRASE+1 ;DID WE GET NULL PRJ OR PRG??
JRST BADPPN ;ILLEGAL
HLLZ D,PHRASE ;GET PHRASE OVERFLOW
HLR D,PHRASE+1 ;MORE OVERFLOW
JUMPN D,BADPPN ;LOSE IF ANY OVERFLOW
MOVEM K,MESDAY ;SAVE THE PRJ-PRG DELIMITER
HRLZ D,PHRASE ;GET PROJECT
HRR D,PHRASE+1 ;ADD IN PROGRAMMER
MOVEM D,USER ;SAVE IT ALL HERE.
JRST LOGIN2 ;DO MORE.
BADPPN: TRZN FL,RPGSW ;CLEAR RESCANNING.
JRST BADPP0
CAIN A,12
SKIPE PHRASE ;SKIP IF THERE SIMPLY WAS NOTHING THERE
BADPP0: OUTSTR [ASCIZ/? Illegal Project-Programmer Name. Please try again.
/]
BADPP1: INCHRS A ;TOUGH SHIT IF HE TYPED AHEAD
JRST LOGIN1
CAIN A,175
EXIT
CAIN A,12
JRST LOGIN1
JRST BADPP1
PASINI: SKIPE ONEPAS ;HAVE WE BEEN HERE BEFORE?
POPJ P, ;YES.
MOVE A,GOD
MOVSI B,'UFD'
SETZ C,
MOVE D,GOD
LOOKUP DMP,A
JRST UFDLER ;OOPS
MTAPE DMP,RDINFO ;READ 1,1 PASSWORD
JRST UEXIT ;SUPER HORRENDOUS ERROR NUMBER 0
MOVE A,INFOS+LOSPSW
MOVEM A,ONEPAS
SETZM INFOS+LOSPSW
POPJ P,
HACKR: RESCAN D
MOVE B,[POINT 9,TYIBUF]
SETZM TYIBUF
CAIL D,4*50-1 ;WILL IT FIT?
JRST [OUTSTR [ASCIZ/Please LOGIN first. Type your Project-Programmer name.
/]
JRST BADPP1] ;NO. FLUSH UNTIL NOTHING LEFT
MOVE C,LINCHR ;NEED THIS TO TEST FOR FREE LF
HACKR0: SOJL D,HACKR1
INCHRS A
EXIT ;LYING GODDAM SYSTEM
JUMPE A,HACKR0
TLNE C,2 ;DO WE GET FREE LF?
JRST HACKR3 ;NO, TREAT CR LIKE REGULAR OLD CHAR
CAIN A,15 ;CR?
JRST HACKR2 ;YES.
HACKR3: IDPB A,B
JRST HACKR0
HACKR2: SOJL D,HACKR3 ;COUNT DOWN
INCHRS A ;GET THE LF
EXIT
XORI A,7 ;AS WE SAY IN FAIL, 12≠15
JRST HACKR3 ;COPY CTRL-META FROM LF TO CR.
HACKR1: MOVEI A,0
IDPB A,B
OUTSTR [ASCIZ /Please type your Project and Programmer name.
/]
JRST LOGIN1
SUBTTL CONTINUE. CHECK FOR SPECIALS
LOGPRO: OUTSTR [ASCIZ/Login is prohibited
/]
EXIT
LOGIN2: MOVE P,[IOWD PDLEN,PDLIST] ;MAKE SURE STACK IS HAPPY
NOTGOD: MOVE A,USER
HRRZ C,USER
IFG PROTLN,<
MOVSI B,-PROTLN
CAME A,PROTAB(B)
CAMN C,PROTAB(B)
JRST LOGPRO ;PROHIBIT LOGIN
AOBJN B,.-3
>
IFG NNETLN,<
TRNN FL,IMPLIN
JRST NOTGD1
MOVSI B,-NNETLN
CAME A,NNETAB(B)
CAMN C,NNETAB(B)
JRST LOGPRO ;PROHIBIT LOGIN
AOBJN B,.-3
>
NOTGD1:
TRNE FL,MAINT+CTYLIN+NOTNOW ;MAINTMODE OR CTY OR REFUSING LOGIN?
TRNE FL,PTYLIN ;LET PTY IN SINCE ITS CONTROLLER GOT IN.
JRST UFDCHK ;NOT MAINTMODE OR A PTY.
TRC FL,MAINT+CTYLIN
TRCN FL,MAINT+CTYLIN
JRST UFDCHK ;MAINTMODE & CTY. LET ANYONE IN
HRRZ A,USER ;GET NAME OF USER
MOVSI B,-GOODTL ;GET LENGTH OF GOODGUY TABLE
JUMPE B,NTGD1A
CAME A,GOODGY(B) ;IS THIS A GOODGUY
AOBJN B,.-1 ;NO LOOP
JUMPL B,UFDCHK ;JUMP TO LET HIM IN
NTGD1A: TRNN FL,MAINT+NOTNOW ;MAINT MODE OR REFUSING LOGINS?
JRST NOCTYL ;NO. MUST BE THE CTY
TRNE FL,MAINT
JRST NOTGD2 ;GIVE MAINT. MESSAGE
OUTSTR [ASCIZ/The system is not available for normal operation/]
JRST NOTGD3
NOTGD2: OUTSTR [ASCIZ/The system is down for maintenance/]
NOTGD3: OUTSTR [ASCIZ/ at this time.
You can't login unless you know the /]
MOVE W,MPASS
PUSHJ P,PASSGO
JRST .+2
JRST UFDCHK
OUTSTR [ASCIZ/Sorry. Please try again later.
/]
EXIT
NOCTYL: OUTSTR [ASCIZ/The CTY is for debugging only,
unless you know the /]
MOVE W,CPASS
PUSHJ P,PASSGO
EXIT
UFDCHK:
UFDCK1: MOVE A,USER ;GET THE PPN
MOVEM A,UFDLOK
MOVSI B,'UFD' ;LOOK FOR <PPN>.UFD
SETZ C, ;
MOVE D,GOD ;THIS IS MFD'S PPN
MOVEM D,UFDLOK+3
LOOKUP DMP,A ;LOOK FOR UFD.
JRST SURE ;NO UFD. ASK HIM THE QUESTION.
MOVEM B,UFDLOK+1
MOVEM C,UFDLOK+2
JRST FNDPP ;VALID UFD. WE LET HIM THROUGH
SURE: CLOSE DMP,
HRRZ B,B ;GET THE ERROR CODE
JUMPN B,UFDLER ;JUMPE IF ERROR STATUS FROM LOOKUP
SKIPE GOTUFD ;DID WE GO THRU HERE BEFORE
JRST NOUFD ;CAN'T FIND IT AGAIN!
TRNE FL,PTYLIN ;NO UFD YET. NOT IN LIST. BUG HIM.
EXIT ;KILL ANY PTY'S
MOVE A,USER
CAMN A,['100100'] ;100,100 WE ALLOW
JRST SUR2
IFN NETGUE,<
CAMN A,['NETGUE'] ;THIS UFD OUGHT NOT DISAPPEAR
JRST SUR4
>
SUR1: ANDI A,-1 ;RIGHT SIDE ONLY
LSH A,6 ;DISASSEMBLE PRG
CAMG A,['9←←←']
JUMPN A,SUR1 ;NUMBER SEEN. LOOP UNTIL SOMETHING NICE HAPPENS
JUMPE A,BADPPN ;JUMP IF NOTHING BUT NUMBERS
SUR2: TRNN FL,IMPLIN ;IS THIS AN IMP?
JRST SUR3
IFN NETGUE,<
OUTSTR [ASCIZ/We prefer that our ARPA NET guests login as "NET,GUE".
Type "Y" to be logged in as "NET,GUE"; anything else to proceed: /]
PUSHJ P,YORN
JRST SUR2A ;HE DOESN'T WANT TO BE NET,GUE.
MOVE D,['NETGUE'] ;NOW WE HAVE A NEW NAME.
MOVEM D,USER ;SAVE IT
JRST LOGIN2 ;TRY AGAIN.
>
SUR2A: OUTSTR NNUFD
EXIT
NNUFD: ASCIZ /
Sorry. Since too many network users have abused our hospitality, we
no longer allow the use or creation of a guest account.
You may run certain programs without logging in. Type: HELP ARPA
/
SUR3: OUTSTR [ASCIZ /Are you sure? /]
PUSHJ P,YORN
JRST LOGIN1 ;ANOTHER NON-EX UFD TAKES GAS.
SUR4:
IFE NETGUE,<
MOVE A,USER
CAMN A,['NETGUE']
JRST SUR2A
>
PUSHJ P,UCHECK ;CHECK THE EXISTANCE OF A USER.
MOVE A,USER ;MAKE A UFD FOR THIS GUY
MOVSI B,'UFD'
MOVSI C,005000 ;SET PROTECTION OF UFD
MOVE D,GOD ;NAME OF 1,1
ENTER DMP,A ;MAKE UFD BY DOING ENTER
JRST UFDEER ;CAN'T MAKE A UFD?
SETZM INFOS ;ZERO STUFF
MOVE A,[XWD INFOS,INFOS+1]
BLT A,INFOS+INFON-1
MOVSI A,400000
SKIPN CKCODE ;IS THIS GUY AUTHORIZED?
MOVEM A,INFOS+LASDAT ;NO! SET BIT IN LASDAT
MTAPE DMP,WRINFO ;WRITE INFOS ENTRY TO INITIALIZE
JFCL
CLOSE DMP, ;CLOSE THE FILE (IS EMPTY FILE)
SETOM GOTUFD ;SET FLAG ABOUT HAVING MADE A UFD
JRST UFDCK1 ;BACK AND LOOK FOR THE FILE
FNDPP: SETOM GOTUFD
MTAPE DMP,RDINFO ;READ INFO ENTRY FROM HIS UFD
JRST .+2
JRST FNDPP1 ;IS OK
SETZM INFOS
SETZM GOTUFD
MOVE A,[XWD INFOS,INFOS+1]
BLT A,INFOS+INFON-1
FNDPP1: SETZM INFOS+DEFPRO+1
MOVE A,NOW
SKIPGE INFOS+LASDAT
TLO A,400000 ;KEEP LOSER BIT SET.
EXCH A,INFOS+LASDAT ;SAVE CURRENT TIME
TLZ A,400000
MOVEM A,LASLOG ;SAVE DATE,TIME OF LAST LOGIN
SKIPE W,INFOS+LOSPSW ;DOES THIS GUY HAVE A PASSWORD?
JRST LGN3A ;YES ASK FOR IT.
;IF NETGUE=0 THEN NOONE WITH ACCOUNT NAME NET,GUE CAN GET THIS FAR?
MOVE A,USER ;GET USER NAME
TRNE FL,IMPLIN ;IMP?
CAMN A,['NETGUE'] ;YES. OK PPN?
JRST LOGIN8 ;NOT IMP, OR [NET,GUE]
MOVE B,INFOS+DEFPRO ;GET THE DEFAULT PROTECTION WORD
TLNE B,400
JRST LOGIN8 ;ALLOW REMOTE LOGIN W/O PASSWORD W/O LUPPRV
COMMENT $
OUTSTR [ASCIZ/Please type the Remote User's /]
MOVE W,REMPAS
PUSHJ P,PASSGO
SKIPA W,PHRASE ;GET THE WORD HE TYPED
JRST LGN3A0 ;PASSWORD IS OK
JUMPN W,LEXIT ;HE F***ED UP TOO MANY TIMES
JRST LOGIN1 ;LET HIM TRY ANOTHER NUMBER
LGN3A0:OUTSTR [ASCIZ/The Remote User's Password has been eliminated.
You must have a password on your PPN to log in remotely. You can set a password for
remote logins only: log in with % as the delimiter between prj and prg names, and
it will explain how.
/]
JRST LOGIN8
$
OUTSTR [ASCIZ /Remote login prohibited for that account.
You must log in locally and set a password to allow remote logins.
/]
JRST LEXIT
LGN3A: TRNN FL,IMPLIN ;IF THIS IS A LOCAL USER
SKIPL UFDLOK+2 ; AND PASSWORD IS REMOTE-ONLY,
SKIPA A,USER
JRST LOGIN8 ; DON'T BOTHER ASKING
TRNN FL,PTYLIN
JRST LOGIN3
CAMN A,PTYPPN
JRST LOGIN9 ;AVOID PASSWORD CHECK FOR PTY IF
;CONTROLLER HAS SAME PPN.
LOGIN3: PUSHJ P,PASSGO
SKIPA W,PHRASE ;GET THE WORD HE TYPED
JRST LGIN3B ;PASSWORD IS OK
JUMPN W,LEXIT ;HE F***ED UP TOO MANY TIMES
JRST LOGIN1 ;LET HIM TRY ANOTHER NUMBER
HELP1: OUTSTR HLP1MS
JRST HELP1R
HELP2: OUTSTR HLP2MS
JRST HELP2R
LGIN3B:
IFG SPYLEN,<
TRNN FL,IMPLIN ;ON AN IMP?
JRST LGIN3C ;NO.
MOVSI B,-SPYLEN
MOVE A,USER
HRRZ C,USER
CAME A,SPYTAB(B)
CAMN C,SPYTAB(B)
SKIPA C,PTYTJB ;SPY ON THIS USER. SEND MAIL.
AOBJN B,.-3
JUMPG B,LGIN3C
MOVEI D,SPYNOW ;ADDRESS OF MESSAGE
MOVEM A,SPYNAM ;NAME OF USER SENT VIA MAIL TOO.
SKPSEN C ;SEND MESSAGE TO LISTENER
JFCL ;MAILBOX FULL
JFCL ;OK
;NON EX JOB NUMBER?
LGIN3C:
>
TRZ FL,IMPLIN ;HE HAS SUPPLIED A PASSWORD. MAKE HIM LOCAL
LOGIN8: MOVE TAC,MESDAY ;GET THE P-P DELIMITER
MOVE W,USER
CAME W,['NETGUE'] ;DON'T LET THESE TURKEYS SET A PASSWORD
CAIE TAC,"%" ;DO WE HAVE TO CHANGE THE PASSWORD
JRST LOGIN9 ;NO WE'RE ALL SET
SKIPE INFOS+LOSPSW ;ALREADY HAS A PASSWORD?
OUTSTR [ASCIZ\<cr> - retain old password,
/<cr> - clear password,
or \]
OUTSTR [ASCIZ/New /]
MOVEI W,0 ;TELL PASSGO TO GET US A NEW PASSWORD
PUSHJ P,PASSGO ;LOOK FOR A PASSWORD
SKIPN A,PHRASE ;GET THE NEW PPN
CAIN K,"/" ;IS ZERO. CLEAR OR LEAVE ALONE? SKIP IF NOT /
MOVEM A,INFOS+LOSPSW ;STUFF THIS IN OUR UPPER
OUTSTR [ASCIZ/Old Directory Protection = /]
LDB A,[POINT 9,UFDLOK+2,8]
MOVEM A,UFDLOK+4 ;SAVE OLD PROT.
PUSHJ P,OCTOUT
OUTSTR CRLF
;MAYBE TAKE THIS OUT EVENTUALLY:
SKIPE INFOS+LOSPSW
OUTSTR [ASCIZ/If you want your password to be used for remote logins only,
turn on the 400 bit in your directory protection.
/]
HELP1R: OUTSTR [ASCIZ/New Protection (<cr> to keep old value, ? for help) = /]
PUSHJ P,OCTIN
JUMPL C,HELP1 ;TELL HIM WHAT TO DO
JUMPG C,.+2 ;JUMP IF ARGUMENT GIVEN
LDB A,[POINT 9,UFDLOK+2,8] ;NO ARGUMENT. USE OLD PROTECTION VALUE
DPB A,[POINT 9,UFDLOK+2,8] ;SAVE NEW PROTECTION
ANDI A,777
XORM A,UFDLOK+4 ;FLAG SET IF PROT CHANGES.
OUTSTR [ASCIZ/Old Default File Protection = /]
LDB A,[POINT 9,INFOS+DEFPRO,8]
PUSHJ P,OCTOUT
OUTSTR CRLF
HELP2R: OUTSTR [ASCIZ/New Protection (<cr> to keep old value, ? for help) = /]
PUSHJ P,OCTIN
JUMPL C,HELP2 ;MORE BLURBAGE
JUMPE C,.+2
DPB A,[POINT 9,INFOS+DEFPRO,8]
LOGIN9:
TRNE FL,NODATE+MAINT ;SUPPRESS DATE UPDATE?
JRST LOG.11 ;YES. OUT QUICK
MTAPE DMP,WRINFO ;WRITE THE NEW INFO DATA
JFCL ;IGNORE ERRORS
CLOSE DMP, ;CLOSE CHANNEL
SKIPN UFDLOK+4 ;UFD PROT CHANGED?
JRST LOG.11 ;NO.
MOVE D,[UFDLOK,,A] ;COPY THE LOOKUP BLOCK
BLT D,D
RENAME DMP,A ;RENAME TO SET THE NEW PROTECTION
OUTSTR [ASCIZ/Rename to change UFD protection failed
/]
LOG.11: PUSHJ P,AFOOL ;CHECK OUT APRIL 1
PUSHJ P,HALLOW ;HALLOWEEN?
PUSHJ P,GLOG ;GO LOGIN!
PUSHJ P,SYSTAT ;TELL ABOUT SYSTEM STATUS.
;FALL OFF THE PAGE.
SUBTTL HERE IMEDIATELY AFTER LOGIN.
TRNE FL,PTYLIN+NODATE
JRST FOUND ;QUICK EXIT FOR PTY AND GOD TAB USERS
MESMER: MOVE A,JOBFF ;LOAD JOBFF
MOVE C,MSGPG3 ;LOGGED IN MESSAGE TYPE
MOVEM A,DISKBF ;SAVE AS BUFFER SPACE FOR DISK
MOVE TAC,MESDAY
CAIE TAC,"/" ;SUPPRESS NOTICES?
SETZM MESDAY ;NO
JUMPE C,.+2
HRLZS B,MSGPG4
PUSHJ P,IDISK ;INIT CHANNEL FOR OPTION FILE
MOVEM A,JOBFF ;SET JOBFF ABOVE THE BUFFERS
PUSHJ P,OPTION ;READ THE OPTION FILE
MOVE A,LASLOG
MOVEM A,INFOS+LASDAT
PUSHJ P,ALLMES ;THINK ABOUT ALL THE MESSAGES FROM [2,2]
FOUND: INSKIP A ;FLUSH ↑O
JFCL
SKIPE TYIBUF ;SPECIAL HACK MODE?
JRST HACKD ;YES. TYPE ALL THAT SHIT BACK IN.
FOUND1: TLNN FL,LOGRUN!%INIT!COOKEE ;RUNING LOGRUN, COOKEE OR INIT FILE?
JRST FOUND2
TLNN FL,LOGRUN ;SKIP IF LOGRUN , PREFER LOGRUN OVER INIT
SKIPA A,[TRNSWP] ;GET THE BLOCK FOR INIT
MOVEI A,LRB ;GET THE BLOCK FOR LOGRUN
TLNE FL,COOKEE ;DIRECT FOR HIGH BROW COOKIE OPTION
MOVEI A,['DSK '↔'BYE '↔'DMP '↔0↔'105SGK'↔0]
SWAP A,
FOUND2: TLNN FL,PORNO
JRST LEXIT
MOVEI A,PRB
SWAP A,
LEXIT: SKIPE 124
EXIT 1, ;IF PRIVILEGED, DON'T REALLY EXIT
EXIT ;NO LEAVE QUIETLY
HACKD: MOVEI 0,0
MOVE B,[POINT 9,TYIBUF]
HACKD1: ILDB A,B
HACKD2: JUMPE A,HACKD3 ;JUMP IF DONE
PTWR1S 0 ;WRITE CHARACTER TO THIS LINE
JRST HACKD3 ;NO MORE ROOM. EXIT NOW. AT LEAST WE TRIED
JRST HACKD1 ;LOOP.
HACKD3: EXIT ;HEAVE A SIGH OF RELIEF
SUBTTL DO THE LOGIN NOW!
GLOG: HRRZ A,USER
MOVE A,[XWD -LBLEN,DBLOCK]
SKIPE DEBUG
JRST GLOG1
SETZM GUGGLE ;ZERO ALL THE PASSWORDS
MOVE B,[XWD GUGGLE,GUGGLE+1]
BLT B,ZATCH ;ZERO ALL THE CRUCIAL STUFF
TRNE FL,IMPLIN ;IS THIS AN IMP?
TDZA B,B ;YES. NETWORK USER DOESN'T GET LOCAL USER BIT
MOVSI B,1 ;TURN ON THE NOT NETWORK USER BIT
IOR B,INFOS+PRVBIT ;OR IN THE BIT
MOVEM B,USRBIT ;SAVE PRIVILEGES
LOGIN A,
GLOG1:
IFN NETGUE,<
MOVE A,USER ;IF HE IS NET,GUE
TRNN FL,IMPLIN
TRNN FL,PTYLIN
CAME A,['NETGUE'] ; LET'S SEE WHO HE REALLY IS
JRST GLOG1A ; JUST OUT OF CURIOSITY
OUTSTR [ASCIZ /What is your name, please? /]
HRLZI A,-NGNMLN ;PREPARE TO READ IN CHARS
MOVE B,[POINT 7,NGNMBF]
NGNMLP: INCHWL C ;GET A CHAR
CAIN C,15
JRST NGNMDN ;DONE TYPING
CAIN C,12
JRST NGNMLF ;YOU WOULDN'T HAVE IMAGINED SOMEBODY'D DO THIS...
IDPB C,B
AOBJN A,NGNMLP
NGNMFL: INCHWL C ;OVERFLOW, FLUSH THE REST
CAIN C,12
JRST NGNMLF
CAIE C,15
JRST NGNMFL
NGNMDN: INCHWL C ;GET THE LF
NGNMLF: TRNN A,-1
JRST GLOG1A ;HE TYPED NOTHING, FORGET IT
MOVEI C,0 ;DEPOSIT A NULL FOR LUCK
IDPB C,B
MOVNI A,6(A)
IDIVI A,5 ;WORDS OF TMPCOR NEEDED
HRLM A,NGNMUU+1 ; (NEGATIVE FOR IOWD)
MOVE A,[3,,NGNMUU] ;WRITE FILE
TMPCOR A,
JFCL ;LOST, TOO BAD
>
GLOG1A: PUSHJ P,LOGON ;TYPE DATE AND TIME
SETOM SFLAG ;NO TIMEOUTS ANY MORE
SS1:
MOVSI A,-1 ;GET CURRENT LEVEL
SLEVEL A,
HLRZ A,A
CAIGE A,144
TRNE FL,PTYLIN
JRST NOSL
JUMPE A,NOSL
IDIVI A,12
ADDI B,"0"
JUMPE A,TSL1
ADDI A,"0"
TTCALL 1,A
TSL1: TTCALL 1,B
OUTSTR [ASCIZ/% SL
/]
NOSL: POPJ P,
SUBTTL DO-ALL SCANNER. MAXIMUM UTILITY AND INTOLERANCE.
GETP: SETZB B,PHRASE ;B = SIXBIT ACC. PHRASE 1
SETZB C,PHRASE+1 ;C WILL COUNT PHRASES,, PHRASE 2
MOVEI D,40 ;WE WILL WAIT 32 SECONDS FOR TYPIN
SKIPN SFLAG ;ARE WE DOING SPECIAL INPUT?
JRST TYPEIN ;NOPE. TIME THIS GUY
INCHWL A ;SPECIAL. WE'LL WAIT FOREVER
JRST GETCK ;OK. WE SAW ONE.
TYWAIT: SOJL D,LEXIT ;DECREASE COUNT. FLUSH IF HE'S TOO SLOW
MOVEI A,1 ;SLEEP FOR 1 SECOND
SLEEP A, ;WHILE WAITING FOR HIM TO TYPE A LINE
TYPEIN: INCHSL A ;INPUT A CHARACTER IF LINE READY AND SKIP
JRST TYWAIT ;LINE NOT READY. WAIT FOR IT
JRST GETCK
GETCH: INCHRS A ;GET ANOTHER, OR SKIP
POPJ P, ;NOTHING THERE. WE MAKE AN ERROR
GETCK: JUMPE A,GETCH ;FLUSH NULLS. NO ONE CAN SEND THEM.
JFCL ;PATCH HERE.
CAIN A,12 ;LF ENDS EVERYTHING
JRST GETHF ;ALL DONE
CAIN A,15
JRST GETCH ;FLUSH CR
CAIE A,40
CAIN A,11
JRST [ ; JUMPE C,GETCH ;FLUSH BLANKS AND TABS IN FIRST TERM
JUMPE B,GETCH ;FLUSH LEADING BLANKS AND TABS
JRST GETHF] ;ASSUME THAT WE'VE SEEN WHOLE TERM
CAIN A,175 ;IS THIS AN ALTMODE?
EXIT ;YES. ABORT LOGIN
CAIN A,"⊗" ;SPECIAL?
JRST SETDDT ;YES GO SET THE DEBUG MODE
CAIE A,"," ;COMMA DELIMITS PHRASE 1.
CAIN A,"/" ;SO DOES SLASH
JRST GETHF0 ;GO ANNOUNCE THE DELIMITER.
CAIE A,"." ;ALLOW THIS AS QUICKIE ALSO -- RPH
CAIN A,"|"
JRST GETHFA
CAIN A,"%" ;SO DOES %
JRST GETHF0 ;DO THE DELIMITER THING
CAIL A,"0"
CAILE A,"9"
JRST .+2
JRST GETCON ;ALLOW DIGITS THROUGH
CAIL A,"a"
CAILE A,"z"
JRST .+2 ;NOT LOWER CASE
TRZ A,40 ;MAKE UPPER CASE
CAIL A,"A"
CAILE A,"Z"
JRST [SETOM PHRASE ;THIS IS A LOSER
POPJ P,]
GETCON: SUBI A,40 ;MAKE SIXBIT
ANDI A,77 ;SCRAPE OFF ANY EXCESS BITS.
TLNE B,770000 ;DON'T SHIFT TOO FAR
JRST GETCH ;TOO FAR. IGNORE ANYTHING ELSE
LSH B,6 ;MAKE ROOM.
IOR B,A
JRST GETCH ;GO GET SOME MORE.
GETHFA: TRO FL,NODATE ;TURN ON FLAG
GETHF0: MOVE K,A ;SAVE THE DELIMITER HERE.
GETHF: JUMPE B,CPOPJ ;NO JUSTIFICATION FOR NOTHING.
MOVEM B,PHRASE(C)
CAIN A,12
JRST CPOPJ1
SETZB B,D
JUMPG C,SSCAN ;SCAN FOR SERVICE LEVEL
AOJA C,GETCH ;INCREMENT TERM COUNTER
SSCAN: INCHRS A ;GET A CHARACTER
POPJ P, ;NO GOOD
CAIN A,12 ;LINE FEED?
JRST SSCANX ;YES THATS ALL
CAIN A,15 ;FLUSH CR
JRST SSCAN
CAIE A,40
CAIN A,11
JRST SSCAN ;FLUSH BLANK,TAB
CAIL A,"0" ;SKIP IF TOO SMALL
CAILE A,"9"
POPJ P, ; THIS IS A LOSS
IMULI D,12 ;ACCUMULATE IN D
ADDI D,-"0"(A) ;ADD IN DIGIT
JRST SSCAN
SSCANX: MOVEM D,SLREQ ;SAVE SL REQUEST
JRST CPOPJ1 ;DO THE SKIP RETURN
YORN: MOVEI B,74 ;60 SECONDS OF WAITING
CLRBFI ;FLUSH THE WORLD FIRST
YORN0: MOVEI A,1 ;SLEEP 1 SECOND
SKIPN SFLAG ;CAN'T RUN OUT OF TIME.
SOJL B,CPOPJ ;RUN OUT OF TIME
SLEEP A, ;SLEEP 1 SECOND
INCHRS A ;LOOK FOR A CHARACTER
JRST YORN0 ;NOT THERE, WAIT
CLRBFI
OUTSTR CRLF
CAIE A,"Y"
CAIN A,"y"
JRST CPOPJ1 ;SKIP RETURN FOR "Y"
CAIE A,175 ;LOOK FOR ALTMODE
POPJ P, ;IS OK
EXIT ;KILL THE BASTARD
PASSGO: INSKIP ;FLUSH ↑O
JFCL ;....
MOVEI X,3 ;ALLOW THREE TRYS. W CONTAINS REAL PASSWORD
PASSG1: OUTSTR [ASCIZ/Password = /]
PUSH P,W
MOVEI W,0
TRON FL,CTLVF ;TURN ON SILENT FLAG
CTLV ;TURN OFF DUPLEXING
TRNE FL,DPYLIN ;SKIP UNLESS A DPY
LEYPOS -1400 ;SET DPY LINE OFF THE BOTTOM OF THE PAGE
PUSHJ P,GETP ;GET A PASSWORD
JRST PGLOSE
JRST PGWIN
PGLOSE: SKIPN W,(P) ;SKIP IF WE'RE LOOKING FOR AN EXISTING PASSWORD.
AOSE PHRASE ;GETTING A NEW PASSWORD. IS IT LEGAL?
JRST PGLUZ ;MUST BE A BLANK PASSWORD, OR ILLEGAL
OUTSTR [ASCIZ/A password may contain only letters and digits. Try again./]
MOVEI Y,PASSGO ;CALL REMAINDER AS A SUBR.
MOVEM Y,(P) ;SET "RETURN ADDRESS"
PUSH P,W ;AND SET GOAL PASSWORD ON STACK (ZERO)
;FALL INTO PGLUZ, POP W, POPJ TO PASSGO
PGLUZ: SETZM PHRASE ;NOTHING THERE
PGWIN: CAIE A,12 ;GOBBLE EXTRA CHARS IF ANY
PASG1A: INCHRS A
JRST PASG1B
CAIN A,175
EXIT ;AS USUAL
CAIE A,12
JRST PASG1A
PASG1B: POP P,W
TRZE FL,CTLVF ;TURN OFF FLAG, ECHO ON
CTLV ;TOGGLE DUPLEXING BACK ON.
TRNN FL,DPYLIN
JRST PASSG2
LEYPOS 0 ;RESET LINE EDITOR
TRNN FL,PTYLIN!IMPLIN ;SKIP IF THIS IS A PTY OR IMP
PTWR1W [0
10044] ;SEND A CLEAR TO FLUSH HIS LINE EDITOR
PASSG2: OUTSTR CRLF ;TYPE CRLF SINCE IT DOESN'T ECHO
JUMPE W,CPOPJ ;EMPTY REALLY MEANS GET A NEW ONE
SKIPN Y,PHRASE ;IF PHRASE IS EMPTY
POPJ P, ;RETURN QUICK
CAMN Y,W ;RIGHT PASSWORD?
JRST CPOPJ1 ;YES
PASSG3: SOJLE X,CPOPJ ;COUNT A LOSS AND RETURN IF TOO MANY
OUTSTR [ASCIZ/Wrong. Try again.
/]
JRST PASSG1 ;LOOP
SETDDT: SKIPN JOBDDT ;SKIP IF WE HAVE DDT
POPJ P, ;ILLEGAL CHARACTER IN SCAN
CLRBFI ;FLUSH TYPE AHEAD
OUTSTR [ASCIZ/Master /]
MOVE W,ONEPAS ;THE MAGIC WORD
PUSHJ P,PASSGO ;MAKE SURE HE TYPES IT.
JRST UEXIT ;HE'S A LOSER
OUTSTR [ASCIZ/(DDT)
/] ;TELL HIM WHERE ITS AT.
JRST @JOBDDT ;JUMP TO DDT
SUBTTL DO ALL THE MESSAGE STUFF FROM [2,2]
ALLMES: MOVE A,MSGPPN
MOVSI B,'UFD'
SETZB C,COOKON ;NO COOKIES YET
MOVE D,GOD
PUSHJ P,DREAD ;READ 2 2.UFD
JRST NOMES ;CANT FIND UFD
JUMPE W,NOMES ;UFD EMPTY?
MOVEM W,MUDPTR ;SAVE POINTER TO UFD
MOVE A,USER
MOVEM A,PPNMES
HRRZM A,MSGPRG ;PROGRAMMER MESSAGE
HRRZM A,MSGPG2 ;A.P. NOTICE
HLLZM A,MSGPRJ ;PROJECT MESSAGE
HRLZ A,USER ;GET THE PROGRAMMER NAME
JUMPE A,LEXIT ;CAN'T HAPPEN
TLNE A,770000
JRST .+3
LSH A,6
JRST .-3
MOVEM A,MSGPG1 ;NAME OF PURGE MESSAGE TOO.
MOVEI A,0 ;GET DAYCNT FOR EVENT FILES
DAYCNT A,
MOVEM A,EVENTY ;SAVE HERE TEMPORARILY
IDIVI A,7 ;FIND DAY OF WEEK
MOVE A,EVENTY ;GET DAYCNT BACK
SETZM EVENTZ ;DON'T DO 3-DAYS-FROM-NOW
CAIN B,2 ; UNLESS IT'S FRIDAY
MOVEM A,EVENTZ ; IN WHICH CASE DO IT
PUSHJ P,CVBTO6 ;CONVERT TO SIXBIT OCTAL
MOVEM C,EVENTX ;SAVE TODAY'S NAME
AOS A,EVENTY ;AND DO TOMORROW'S
PUSHJ P,CVBTO6
MOVEM C,EVENTY
SKIPN A,EVENTZ ;IF TODAY ISN'T FRIDAY,
JRST ALNFRI ; SKIP THIS
ADDI A,3 ;BUT IF IT IS,
PUSHJ P,CVBTO6 ; GET MONDAY'S DAYCNT FILE
MOVEM C,EVENTZ ; AND PRINT THAT ONE TOO
ALNFRI: SETOM LPTBUF ;SET ≠0 TO MAKE PUTCHR WORK RIGHT
MOVSI N,-MSGLTL ;GET THE - LENGTH OF MESSAGE TABLE
JUMPE N,NOMES ;NO TICKEE NO WASHEE
ALLMS1: MOVE A,MSGL1(N) ;GET THE NAME OF A FILE
HLLZ B,MSGL2(N) ;GET THE FILE EXTENSION
MOVE D,MUDPTR ;GET THE DUMP MODE POINTER
ADDI D,1 ;MAKE DIRECT POINTER
ALLMS2: CAME A,0(D) ;SAME NAME?
JRST ALLMS3 ;NOPE
HLLZ C,1(D) ;GET THE EXTENSION FROM UFD
CAME B,C ;SAME?
JRST ALLMS3 ;NOPE
HRRZ C,MSGL2(N) ;GET THE CODE FOR ALGORITHM NUMBER
CAIL C,DCIDMX ;LESS THAN MAXIMUM ALGORITHM NUMBER
JRST ALLMS4 ;NOPE. I DON'T UNDERSTAND.
HLRZ C,DECIDE(C) ;GET THE DISPATCH FOR BEFORE MESSAGE
PUSHJ P,(C) ;DISPATCH
JRST ALLMS4 ;DON'T PRINT THIS ONE
REPEAT 0,<
HRRZ A,3(D) ;GET THE RETRIEVAL ADDRESS FOR FILE
MOVEM A,MTPB ;SAVE ADDRESS
CAIL A,7*620*12 ;IS ADDRESS REASONABLE?
JRST ALLMS4 ;THIS ONE HAS BAD RETRIEVAL
MTAPE DMP,MTP ;READ THE RETRIEVAL AND FIRST BLOCK
MOVE A,0(D) ;FILE NAME
MOVE B,1(D) ;EXTENSION
CAMN A,FILE0 ;CHECK RETRIEVAL INFORMATION
CAME B,FILE0+1 ;CHECK RETRIEVAL INFORMATION
JRST ALLMS4 ;CAN'T DO ANYTHING ABOUT THAT
MOVE B,MSGPPN
CAME B,FILE0+3
JRST ALLMS4 ;BAD RETRIEVAL
MOVM W,FILE0+5 ;GET THE FILE LENGTH IN WORDS
JUMPE W,BIGFLR ;ZERO LENGTH FILES DONE QUICK
CAILE W,FILENG ;IS THE FILE ≤ OUR MAX CAPABILITY?
JRST BIGFIL ;NO. WE HAVE A BIG FILE.
IMULI W,5 ;CONVERT WORDS TO CHARACTERS
MOVE X,[POINT 7,FILE] ;POINTER TO THE FILE
MOVEM W,DSKBUF+2 ;SAVE CHARACTER COUNT
MOVEM X,DSKBUF+1 ;SAVE BYTE POINTER
SETOM DFAKE ;SET FLAG TO ANNOUNCE FAKERY
JRST BIGFL1 ;FAKE THEM OUT...
>
BIGFIL: PUSHJ P,IDISK ;GET DISK AND BUFFERS FOR INPUT
MOVE W,0(D)
MOVE X,1(D)
SETZB Y,DFAKE ;NOT FAKING READS
MOVE Z,MSGPPN
LOOKUP DSK,W
JRST BIGFLR ;CAN'T HAPPEN
SKIPN COOKON ;ARE WE DOING FORTUNE COOKIES?
JRST ALLM2A ;NO.
MOVEI Y,0 ;C O O K I E
MOVS W,Z ;UNSWAP WORD COUNT
MOVN W,W ;UNNEGATE IT
TIMER X, ;GET THE CURRENT TIME
IDIVI X,-200(W) ;GET THE FILE SIZE-200
IMULI Y,5 ;TIME 5 CHARS/WORD
MOVEM Y,COOKIE ;SAVE AS THE CHARACTER NUMBER IN THE FILE.
ALLM2A: MOVEI M,12 ;FAKE RDDSK INTO THINKING IT SAW LF
SETZM DFAKE
BIGFL1: PUSHJ P,RDDSK ;READ
JRST BIGFL2 ;ALL DONE
PUSHJ P,PUTCHR
JRST BIGFL1 ;LOOP
BIGFL2: CLOSE TTY,
SETZM DFAKE ;UNFOOL THE PROGRAM
SETZM COOKON ;COOKIES EATEN
BIGFLR: RELEAS DSK,
LFRDON: HRRZ C,MSGL2(N) ;GET THE CODE FOR APRES MESSAGE
MOVEI B,CRLF ;WRITE CRLF TO SEPARATE
PUSHJ P,PUTSTR
CLOSE TTY, ;FORCE OUTPUT
HRRZ C,DECIDE(C) ;GET THE DISPATCH
PUSHJ P,(C) ;DO IT
JRST ALLMS4 ;ALL DONE WITH FILE. DO MORE
ALLMS3: ADD D,[XWD UFDN,UFDN] ;DIDDLE D
JUMPL D,ALLMS2 ;LOOP IF WE HAVE MORE TO LOOK FOR
ALLMS4: AOBJN N,ALLMS1 ;DONE WITH ONE FILE. DO MORE
MOVEI B,CRLF
PUSHJ P,PUTSTR
CLOSE TTY,
NOMES: SETZM LPTBUF ;RESET THE FAKER
POPJ P,
DECIDE: XWD DDATE,CPOPJ ;
XWD PERMES,PERMED ;
XWD DONOTE,NOTEDN
XWD DOFORT,CPOPJ ;ANY COOKIES?
XWD DOXMES,CPOPJ
XWD DOPUR,PERMED ;SAME AS PERSONAL MESSAGE DELETE
XWD DONAP,PERMED ;MESSAGE FROM AP
XWD DODIGS,CPOPJ ;AP NEWS DIGEST.
XWD DOONCE,CPOPJ ;DO ONCE TODAY ONLY
SDEF(DCIDMX,.-DECIDE)
DOXMES: MOVEI Y,EXPMOD ;GET ADDRESS OF EXP CELL
PEEK Y,
PEEK Y,
JUMPE Y,CPOPJ ;NO MESSAGE IF CELL NOT SET
JRST CPOPJ1 ;SEND TEXT
DODIGS: TRNE FL,DIGEST
PUSHJ P,DDATE1 ;SEE IF THE DIGEST IS NEW
POPJ P, ;NOT NEW. OR NONE REQUESTED.
INSKIP
JFCL
MOVEI B,[ASCIZ/There's a new A.P. News Digest./]
PUSHJ P,PUTSTR
JRST PERMS2
DOONCE: HLRZ X,NOW ;TODAY'S DATE
HLRZ Y,INFOS+LASDAT ;LAST LOGIN
CAMLE X,Y ;SKIP IF ALREADY LOGGED IN TODAY
JRST CPOPJ1 ;FIRST LOGIN TODAY, DO IT
DDATE: SKIPN MESDAY ;SKIP IF SLASH SEEN
JRST CPOPJ1 ;NO. TYPE THE MESSAGE
DDATE1: LDB Y,[POINT 12,2(D),35] ;GET DATE OF FILE
LDB X,[POINT 3,1(D),20] ;DATE75
DPB X,[POINT 3,Y,23] ;DATE75
LDB X,[POINT 11,2(D),23] ;GET TIME OF FILE
HRL X,Y ;GET DATE,,TIME OF FILE
CAML X,INFOS+LASDAT ;SKIP IF PRECEDES LAST LOGIN
CPOPJ1: AOS (P)
CPOPJ: POPJ P, ;RETURN
DOPUR: MOVEI B,[ASCIZ/
The following message is from the purger:
/]
AOS (P)
JRST PUTSTR
PERMES: INSKIP ;CLEAR ↑O
JFCL ;I DON'T CARE ABOUT IT
MOVEI B,[ASCIZ/There's a note for /]
PUSHJ P,PUTSTR
MOVE B,MSGL1(N) ;GET THE NAME OF THE ADDRESSEE
PERMS1: MOVEI A,0
JUMPE B,PERMS2
LSHC A,6
JUMPE A,PERMS1 ;FLUSH NULLS
ADDI A," "
PUSHJ P,PUTCHR
JRST PERMS1
PERMS2: MOVEI B,CRLF
PUSHJ P,PUTSTR
TRNE FL,MESSAG ;FORCING MESSAGES?
JRST CPOPJ1 ;YES.
TLNE FL,NOMAIL
POPJ P, ;FLUSH ASKING.
MOVEI B,[ASCIZ/Read it now? /]
TTCALL 11, ;FLUSH TYPE-AHEAD
PUSHJ P,PUTSTR ;WRITE A STRING
CLOSE TTY, ;FORCE IT OUT
PUSHJ P,YORN
JRST [CAIE A,"R"
CAIN A,"r"
PUSH P,[DONOTE]
JRST PERMS4]
AOS (P) ;SET UP SKIP RETURN
PERMS4: MOVEI B,CRLF ;WRITE CRLF AFTER HIS REPLY
JRST PUTSTR ;LET PUTSTR RETURN WITH POPJ
PERMED: SKIPE NOTEON
JRST NOTEDN
TLNE FL,NOMAIL
POPJ P,
INSKIP ;TURN OFF ↑O
JFCL ;IGNORE NON-SKIP
MOVEI B,[ASCIZ/
Type "Y" to delete this message now: /]
PUSHJ P,PUTSTR ;WRITE STRING
CLOSE TTY, ;FORCE IT OUT
PUSHJ P,YORN ;ASK
POPJ P, ;NO DELETE
MOVE W,0(D)
MOVE X,1(D)
SETZ Y,
MOVE Z,MSGPPN
LOOKUP DMP,W ;SEEK FILE
POPJ P, ;CAN'T FIND IT. THAT'S TOUGH
SETZB W,X
SETZ Y,
MOVE Z,MSGPPN
RENAME DMP,W
JFCL
CLOSE DMP,
POPJ P,
NOTTY: OUTSTR [ASCIZ/TTY INIT FAILED FOR NOTICE TYPEOUT
/]
EXIT
DONOTE: SETOM NOTEON ;DOING NOTICE FILE RIGHT NOW
JRST DDATE ;DO THE DATE STUFF
NOTEDN: SETZM NOTEON ;CLEAR FLAG
POPJ P, ;RETURN
DOFORT: TRNN FL,ME
POPJ P, ;NO COOKIES!
SETOM COOKON ;SET THE COOKIE FLAG
SETZM CDONE ;NOT DONE WITH COOKIES YET
JRST CPOPJ1 ;GOOD COOKIES
DONAP: MOVEI B,[ASCIZ/Message from the News Service/]
PUSHJ P,PUTSTR
JRST PERMS2
CVBTO6: MOVE D,[POINT 6,C]
MOVEI C,0
CVB61: IDIVI A,10
JUMPE A,CVB62
HRLM B,(P)
PUSHJ P,CVB61
HLRZ B,(P)
CVB62: ADDI B,'0'
IDPB B,D
POPJ P,
SUBTTL BUFFERED READER AND OPTION FILE STUFF
rddsk: sosle dskbuf+2 ;usual disk reader
jrst rddsk1 ;this guy will strip
skipe dfake
popj p, ;if faking the disk, don't do input
movei a,0
input dsk, ;off any line numbers
statz dsk,740000 ;too!
jrst rderr
statz dsk,20000
popj p,
rddsk1: ildb a,dskbuf+1
push p,a
move a,@dskbuf+1
trnn a,1
jrst rddsk2 ;not part of a sequence number
aos dskbuf+1 ;sequence number: go past 5 characters
movni a,5 ;change count
addm a,dskbuf+2 ;to 5 less
ADDM A,COOKIE
pop p,(p)
jrst rddsk ;read more
rddsk2: pop p,a
SOS COOKIE
jumpe a,rddsk ;ignore nulls
skipe cookON
jrst rdcook ;read cookie file
skipn noteon ;special for notice file?
jrst cpopj1
cain a,"∂" ;special character?
jrst rddsk4 ;yes...
rddsk3: move m,a ;no. save character
jrst cpopj1 ;return to caller
rddsk4: caie m,12 ;last thin seen a line feed?
jrst rddsk3 ;nope
dtscan: move l,d ;save d in l
pushj p,digin
subi b,1
movem b,day ;save day of month
pushj p,getsix ;get the name of the month
hllzm b,month ;save the month name
pushj p,digin ;get the year
subi b,100 ;subtract 64 from it
movem b,year ;save it
pushj p,digin ;look for a decimal number
idivi b,144
imuli b,74
add b,c
movem b,time ;save time of day
move d,l ;restore d from l.
scoop: pushj p,rddsk ;scan to the end of the line
popj p, ;eof. that's all folks
caie a,12
jrst scoop ;loop
SKIPN mesday ;SKIP if suppressing message
JRST RDDSK ;NO SUPRESSING MESSAGES
move a,month ;get the month
movsi b,-montlg ;- length of month table
came a,montht(b) ;same?
aobjn b,.-1
jumpge b,rddsk ;go write this message
move a,year
imuli a,14
addi a,0(b)
imuli a,37
ADD A,DAY ;ADD TO GET THE DATE IN SYSTEM FORM
HRLZ A,A ;SWAP IT
HRR A,TIME ;GET TIME IN MINUTES
CAMGE A,INFOS+LASDAT ;SKIP IF MESSAGE RECENT
POPJ P, ;NOT RECENT ENOUGH
JRST RDDSK ;RECENT MESSAGE. READ AND WRITE
RDERR: OUTSTR [ASCIZ/
DATA ERROR IN MESSAGE FILE.
/]
POPJ P,
IDISK: INIT DSK,200 ;INIT THE DISK
SIXBIT /DSK/ ;SO THAT THE
XWD 0,DSKBUF ;ROUTINES ON THIS
JRST NODISK ;PAGE CAN WORK!
MOVE A,DISKBF ;SET UP BUFFERS IN
EXCH A,JOBFF ;FIXED CORE
INBUF DSK,2 ;SO THEY ARE REUSED
EXCH A,JOBFF ;SEQUENTIALLY
SETZM DFAKE ;DON'T FAKE THE DISK
POPJ P, ;RETURN
OPTION: MOVE A,[SIXBIT/OPTION/] ;LOOKUP OPTION FILE
MOVSI B,'TXT' ;FILE EXTENSION
SETZ C,
MOVE D,USER
LOOKUP DSK,A ;SEEK FILE
JRST RPOPJ ;NO OPTIONS. RELEAS DISK AND POPJ
PUSHJ P,SEARCH ;LOOK FOR 'LOGIN' IN THE FILE.
JRST RPOPJ ;IT'S NOT THERE.
CAIE A,":" ;THIS MUST BE BREAK
JRST RPOPJ ;BAD FORMAT FOR FILE
OPT.1: PUSHJ P,GETSIX ;GET OPTION NAME
MOVSI C,-OPTL ;LOAD TABLE LENGTH
CAME B,OPTAB1(C) ;LOOK FOR NAMES MATCH
AOBJN C,.-1 ;LOOK
JUMPGE C,OPT.2 ;JUMP IF NOT IN TABLE
XCT OPTAB2(C) ;EXECUTE INTRUCTION FROM TABLE
OPT.2: CAIN A,"," ;LOOK AT BREAK CHARACTER
JRST OPT.1 ;IS A COMMA. LOOK FOR MORE
RPOPJ: RELEAS DSK,
POPJ P,
OPTAB1: 'ME ' ;GIVE ME A MESSAGE
'COOKIE' ;GIVE HIGHER BROW FORTUNE COOKIE MESS
'MESSAG' ;PERSONAL MSG TYPED AUTOMATICALLY.
'LOGRUN' ;RUN THE LOGIN POST PROCESS
'INIT ' ;RUN THE PROGRAM 'INIT' IN USERS AREA
'WHO ' ;WHO LINE STARTUP
'UNHIDE' ;UNHIDE THIS DATA DISK.
'HIDE ' ;NOW THAT THE DEFAULT IS DIFFERENT...
'FULL ' ;FULL CHARACTER SET
'TABS ' ;HARDWARE TABS
'FILL ' ;SET TTYFIL
'DIGEST' ;GIVE THE AP NEWS DIGEST.
'PORNO ' ;SOFT-CORE
'NOMAIL' ;SUPPRESS QUESTIONS ABOUT MAIL.
'AUDIO ' ;MUZAK
SDEF(OPTL,.-OPTAB1) ;TABLE LENGTH
OPTAB2: TRO FL,ME ;FLAG NAME
TLO FL,COOKEE
TRO FL,MESSAG
TLO FL,LOGRUN
TLO FL,%INIT
PUSHJ P,[TRNE FL,DPYLIN ;WHO LINE. SKIP IF NOT ON A DPY
TRNE FL,PTYLIN+IMPLIN ;ON A DPY. SKIP IF NOT PTY
POPJ P, ;NOT DPY OR PTY. RETURN
PTWR1W [0
10000+"W"]
POPJ P,] ;RETURN TO XCT
PUSHJ P,[TRNE FL,DPYLIN ;UNHIDE
TRNE FL,PTYLIN+IMPLIN
POPJ P, ;NOT ON DPY
PTWR1W [0
14000+"H"]
POPJ P,]
PUSHJ P,[TRNE FL,DPYLIN ;HIDE
TRNE FL,PTYLIN+IMPLIN
POPJ P, ;NOT ON DPY
PTWR1W [0
10000+"H"]
POPJ P,]
PUSHJ P,[TRNE FL,DPYLIN+PTYLIN ;HERE FOR 'FULL'
POPJ P,
SETO B,
TTCALL 6,B
TLO B,20 ;TURN ON MODEL 37 BITS
TTCALL 7,B ;SET BITS
POPJ P,]
PUSHJ P,[TRNE FL,DPYLIN+PTYLIN ;HERE FOR TABS.
POPJ P,
SETO B,
TTCALL 6,B
TLZ B,10 ;CLEAR TBXPND
TTCALL 7,B
POPJ P,]
PUSHJ P,[TRNE FL,DPYLIN+PTYLIN ;HERE FOR FILL.
POPJ P,
SETO B,
TTCALL 6,B
TLO B,100000 ;SET TTYFIL
TTCALL 7,B
POPJ P,]
TRO FL,DIGEST ;SET FLAG FOR THE DIGEST
TLO FL,PORNO
TLO FL,NOMAIL
PUSHJ P,AUDIO ;READ AUDIO CHANNEL # FROM FILE AND SET
SEARCH: SETZM DFAKE ;DON'T FAKE THE GUY
PUSHJ P,GETSIX ;GET SOME SIXBIT FROM FILE
CAMN B,[SIXBIT/LOGIN /]
JRST CPOPJ1 ;SEARCH WINS.
JRST SR.2
SR.1: PUSHJ P,RDDSK ;READ DISK
POPJ P, ;SEARCH LOSES
SR.2: CAIE A,14 ;FF OR LF TO END THE LINE.
CAIN A,12 ;LOOK FOR LINE FEED
JRST SEARCH ;GOT A NEW LINE. DO THE THING.
JRST SR.1 ;LOOP
GETSIX: SETZ B,
MOVEI C,6
MOVE D,[POINT 6,B]
GSIX.1: PUSHJ P,RDDSK ;GET SOME
POPJ P, ;THAT'S ALL FOLKS
CAIE A,40 ;SKIP SPACES
CAIN A,11 ;AND TABS
JRST [JUMPE B,GSIX.1 ;SKIP LEADING BLANKS, TABS
POPJ P,] ;OTHERWISE RETURN
CAIE A,"=" ;TO PARSE "AUDIO=N"
CAIN A,14 ;FLUSH FF.
POPJ P,
CAIE A,12
CAIN A,15
POPJ P, ;RETURN IF CR OR LF SEEN
CAIE A,"," ;COMMAS
CAIN A,";" ;SEMICOLONS
POPJ P, ;BOTH TERMINATE SIXBIT SCAN.
CAIE A,"-" ;MINUS SIGN TERMINATES SCAN TOO
CAIN A,":" ;: TERMIATES SCAN TOO
POPJ P, ;RETURN
CAIL A,"A"+" "
CAILE A,"Z"+" "
JRST .+2
TRZ A,40 ;MAKE LOWER → UPPER
SUBI A,40 ;MAKE THINGS INTO SIXBIT
SOJL C,GSIX.1 ;DECREMENT COUNT. JUMP IF WE HAVE ENOUGH
IDPB A,D ;STUFF TEXT IN B
JRST GSIX.1 ;LOOP
DIGIN: SETZ B, ;ACCUMULATE DECIMAL
DIGIN1: PUSHJ P,RDDSK ;READ
POPJ P, ;EOF. RETURN
CAIE A," "
CAIN A,11
JUMPE B,DIGIN1 ;SKIP LEADING BLANKS AND TABS
CAIL A,"0"
CAILE A,"9" ;MAKE SURE WE HAVE A DIGIT
POPJ P, ;NO DIGIT. RETURN
IMULI B,12
ADDI B,-"0"(A)
JRST DIGIN1 ;LOOP
RDCOOK: SKIPL COOKIE ;TIME FOR COOKIES NOW?
JRST RDDSK ;NO. NOT YET. GO READ MORE CHARACTERS
SKIPL COOKON ;HAVE WE FLUSHED PAST FIRST LF YET?
JRST RDCK1 ;YES. IT IS TIME TO BE PRINTING MESSAGE
CAIN A,12 ;IS THIS A LF?
MOVMS COOKON ;YES. SET COOKON >0 TO MARK TYPING PHASE.
JRST RDDSK ;AND READ NEXT CHR.
RDCK1: SKIPE CDONE ;DONE WITH COOKIES YET
POPJ P, ;YES. RETURN QUICK
CAIN A,12 ;END OF LINE YET?
SETOM CDONE ;YES NOW WE ARE DONE WITH COOKIES.
JRST CPOPJ1
AUDIO: CAIE A,"=" ;AUDIO SWITCH OPTION
POPJ P, ;MUST BE "AUDIO=N"
TRNE FL,DPYLIN ;SKIP IF NOT ON A DPY
TRNE FL,PTYLIN+IMPLIN ;ON A DPY. SKIP IF NOT PTY
JRST AUDIO4 ;NO, SKIP THE NUMBER
PTWR1W [0
10042] ;SEND ESC
AUDIO1: PUSHJ P,RDDSK ;LOOP TO SEND DIGITS
JRST AUDIO2
CAIN A,"-"
JRST AUDIO3
CAIL A,"0"
CAILE A,"7"
JRST AUDIO2 ;STOP AFTER DIGITS
AUDIO3: MOVEI B,(A)
MOVEI A,0
PTWR1W A ;SEND THE DIGIT
JRST AUDIO1
AUDIO2: PTWR1W [0
"U"] ;(A)UDIO
POPJ P, ;NEXT BETTER BE COMMA IF THERE ARE MORE OPTS
AUDIO4: PUSHJ P,RDDSK
POPJ P,
CAIN A,"-"
JRST GETSIX
CAIL A,"0"
CAILE A,"7"
POPJ P,
JRST GETSIX
SUBTTL UCHECK CHECK VALIDITY BEFORE MAKING NEW UFD.
UCHECK: MOVE A,['ALFACT']
MOVSI B,'DAT'
SETZ C,
MOVE D,['ACTSYS']
PUSHJ P,DREAD
JRST UCKER1 ;ERROR 1, FILE NOT THERE OR READ ERRORS.
HRLZ A,USER ;GET THE PROGRAMMER NAME.
AOJGE W,UCKER1 ;JUMP IF FILE IS EMPTY.
UCHEK1: HLLZ C,(W) ;GET ENTRY FROM FILE
CAMN C,A
POPJ P, ;IS OK TO GO ON,
AOBJN W,UCHEK1 ;LOOP LOOKING.
TDZA A,A
UCKER1: MOVEI A,1
MOVEM A,CKCODE ;SAVE THE CKECK CODE.
MOVEI W,5
UCKE1A: SOJL W,UCKER2
MOVSI A,'LOG'
MOVSI B,'LOG'
SETZ C,
MOVE D,['ACTSYS']
LOOKUP DMP,A ;GET THE FILE OPEN FOR READING
JRST [SETZ D,
HRRZ B,B
JUMPE B,.+1 ;RETURN IF STILL OK.
MOVEI B,1
SLEEP B,
JRST UCKE1A]
MOVS Y,D
MOVN Y,Y
MOVSI A,'LOG'
MOVSI B,'LOG'
SETZ C,
MOVE D,['ACTSYS']
ENTER DMP,A
JRST [MOVEI D,1 ;LOOP WAITING
SLEEP D,
SOJGE W,UCKE1A ;TRY IT ALL AGAIN
JRST UCKER2]
SETZ Z,
LSHC Y,-7
JUMPE Z,UCHEK2
ROT Z,7 ;RESTORE Z TO NORMAL
USETI DMP,1(Y) ;REMEMBER THIS IS BAG BITING 1-ORIGIN
INPUT DMP,[IOWD 200,BUF
0]
STATO DMP,740000
STATO DMP,20000
JRST UCKER3
USETO DMP,1(Y) ;SET SAME BLOCK FOR OUTPUT (1-ORIGIN)
JRST UCHEK3 ;AND JUMP
UCHEK2: UGETF DMP,Y ;GET THE NEXT FREE BLOCK NUMBER
USETO DMP,(Y) ;SET FOR OUTPUT
UCHEK3: MOVEI Y,BUF(Z) ;GET THE FIRST FREE WORD OF BUFFER.
TIMER A, ;GET THE TIME OF DAY
IDIVI A,74*74 ;DIVIDE BY 3600, LEAVE MINUTES IN A.
DATE B,
HRRZM A,(Y) ;SAVE TIME
HRLM B,(Y) ;SAVE DATE TOO
MOVE A,USER
MOVEM A,1(Y)
MOVSI A,400000
SKIPN CKCODE ;SKIP IF THERE WAS A LOOKUP FAILURE.
IORM A,(Y) ;THIS IS A DEFINITE BAD GUY.
SETO A,
TTCALL 6,A
MOVEM A,2(Y) ;SAVE LINE CHARACTERISTICS OF USER'S TTY.
ADDI Z,3 ;WE HAVE ADDED 3 WORDS TO FILE.
MOVN Y,Z ;GET THE NEGATIVE
MOVS Y,Y
HRRI Y,BUF-1
SETZ Z,
OUTPUT DMP,Y
CLOSE DMP,
UCHEK4: SKIPN CKCODE
OUTSTR [ASCIZ/You are not known as an authorized user.
/]
POPJ P,
UCKER2: OUTSTR [ASCIZ/UNABLE TO ENTER THE LOGGING FILE.
/]
CLOSE DMP,
JRST UCHEK4
UCKER3: OUTSTR [ASCIZ/DATA ERROR IN THE LOGGING FILE.
/]
JRST UCHEK4
SUBTTL PREPARE SYSTEM STATISTICS.
SYSTAT: TRNN FL,IMPLIN ;NOBODY WANTS THIS. MAKE THE NET TAKE IT
POPJ P, ;YES. DON'T TELL HIM.
MOVEI A,210
PEEK A, ;BASE OF JBTSTS
HRLI A,A ;SET FOR INDEXING
MOVEM A,JBTSTS ;SAVE IT
MOVEI A,231 ;PEEK
PEEK A,
HRLI A,A ;THE BASE OF JOBQUE
MOVEM A,JOBQUE ;SAVE IT.
MOVEI A,222
PEEK A,
MOVEM A,JOBN ;SAVE JOBN.
SETZB A,C ;FOR ALL JOBS...
SYS.1: MOVEI B,@JBTSTS
PEEK B,
TLNN B,40000 ;JNA?
JRST SYS.2 ;FREE SLOT.
ADDI C,1
MOVEI B,@JOBQUE
PEEK B,
MOVM B,B
CAIN B,6
JRST SYS.1A ;COUNT DIOWQ AS A RUN QUEUE TOO.
CAIE B,14
CAIN B,15
SYS.1A: ADDI C,1000 ;COUNT RUNQ+TQ
SYS.2: CAMGE A,JOBN
AOJA A,SYS.1
MOVEM C,SVSTAT
ANDI C,777
MOVE A,C
PUSHJ P,DECOUT
OUTSTR [ASCIZ/ jobs logged in. /]
MOVE A,SVSTAT
LSH A,-11
PUSHJ P,DECOUT
OUTSTR [ASCIZ/ Running.
/]
POPJ P,
; A FOOL AND HIS MONEY ARE SOON PARTED
AFOOL: TRNN FL,FOOLS ;APRIL 1?
POPJ P,
HRRZ C,USER ;WHO IS THIS?
CAIN C,'GUE'
JRST AFOOL1
HLLZ C,LASLOG
HLLZ B,NOW
TRNN FL,PTYLIN
CAMN C,B ;SKIP MESSAGE IF HE LOGGED IN ONCE ALREADY TODAY
POPJ P,
AFOOL1: OUTSTR AFOOM
MOVEI C,20
MOVEI B,1
AFOOL2: INCHRS A
JRST .+2
POPJ P,
; SLEEP B,
; SOJG C,AFOOL2
POPJ P,
AFOOM: ASCIZ %
Important Announcement:
Due to lack of interest April Fools Day has been canceled.
%
comment % 1974
The University administration has decided not to reinstall the
building air-conditioning because of the energy crisis. They plan to
move the computer to Pine Hall, where the existing a/c will be
adequate.
If the appeal to the Provost fails, we will start the move on May 1.
The computer will be unavailable during the two months it takes to move.
Project personnel will not be moved; a microwave link will permit the
Data Disk and III displays to be used here.
The PDP-6 won't be moved because of its relative inutility. PDP-6
users should reprogram on the PDP-11.
%
;ALL HALLOWS EVE
HALLOW: TRNE FL,PTYLIN ;FOR PTYS (NOT ARPA) WE DO NOTHING
POPJ P, ;SKIP IF WE'RE NOT A DISPLAY TERMINAL
HLRZ A,NOW ;GET THE DATE
IDIVI A,37*14 ;YEARS IN A, DAY OF YEAR IN B.
CAIE B,37*12-1 ;SKIP IF OCT 31
POPJ P,
VOD←←1
MOVEI W,10 ;COUNT TRIES THRU LOOP
VODAGN: OUTSTR [ASCIZ/Trick or Treat?/]
TRNN FL,DPYLIN
JRST VODDON
INIT VOD,410 ;init voder, don't wait for it
'VOD '
VODBUF,,
JRST VODDON ;DONE WITH VODER
MOVSI A,001100
HLLM A,VODBUF+1
MOVEI C,DATA
PUSHJ P,VODSTR
move a,[325010,,0]
adsmap a,
RELEAS VOD,
move a,[320000,,0]
adsmap a,
VODDON: PUSHJ P,TRSSGO ;LOOK FOR 'TREAT'
SOJG W,VODAGN ;LOOP
OUTSTR @VODFOO(w) ;TYPE MESSAGE
outstr crlf
POPJ P,
VODFOO: [ASCIZ /There's no hope for you. Stay away from ladders and black cats./]
[asciz /Sure took you a long time. Avoid making decisions today./]
[asciz /You turkey. You'll get yours in 4 weeks./]
[asciz /This doesn't seem to be your day. I suggest you go home./]
[asciz /Didn't your mother ever warn you about Halloween? Why not?/]
[asciz /Congratulations. You are already a loser. Details will follow./]
[asciz /We had hoped for better things from you. See that you improve./]
[asciz /Not too bad. This may be a good day for you./]
[asciz /Good. You must have done this before./]
VODSTR: HRLI C,441100
VODST1: ILDB A,C
JUMPE A,CPOPJ
PUSHJ P,VODOUT
JRST VODST1
ZZZ←←0
CCC←←3
DEFINE SAY (N,I)<
ZZZ←←ZZZ+<<400+N⊗2+I>⊗<CCC*9>>
CCC←←CCC-1
IFL CCC,<ZZZ
ZZZ←←0
CCC←←3
>
>
DATA: SAY 25,0 ;T
SAY 27,0 ;R
SAY 71,0 ;I
SAY 46,0 ;K
SAY 57,0 ;O
SAY 65,1 ;R
SAY 25,1 ;T
SAY 65,1 ;R
SAY 15,1 ;E
SAY 15,1 ;E
SAY 25,1 ;T
SAY 66,1
ZZZ
0
VODBUF: BLOCK 3
VODOUT: SOSG VODBUF+2
OUT VOD,
JRST VODOU1
OUTSTR [ASCIZ/OUTPUT ERROR/]
HALT
VODOU1: IDPB A,VODBUF+1
POPJ P,
TRSSGO: INSKIP ;FLUSH ↑O
JFCL ;....
PUSHJ P,GETP ;GET A PASSWORD
SETZM PHRASE
CAIE A,12 ;GOBBLE EXTRA CHARS IF ANY
TRSG1A: INCHRS A
JRST TRSG1B
CAIN A,175
EXIT ;AS USUAL
CAIE A,12
JRST TRSG1A
TRSG1B: SKIPN Y,PHRASE ;IF PHRASE IS EMPTY
POPJ P, ;RETURN QUICK
CAMN Y,[' TREAT']
JRST CPOPJ1 ;YES
POPJ P,
;TEXT OF HELP MESSAGES
XLIST
HLP1MS: ASCIZ /The protection code is a three-digit octal number.
You are now being asked for the protection code for your file directory;
this code affects file access for all files in the directory. If you want
to restrict access to most, but not all, of your files you will have a
chance later to set a default protection code which will be used for all
new files created in this directory unless another protection code is
explicitly supplied. The protection code controls access for three
categories of users: yourself (same PPN), other local users, and guest
users (i.e., remote logins on NET,GUE). The bits in the file directory
protection code are interpreted as follows (the given meaning applies
if the corresponding bit is on):
400 The password (if any) for this account will only be required for
remote login, not for login from a local terminal.
200 Presently unused, please leave it off.
100 You may not write files in this directory. (You don't want this.)
40 Other local users may not change the protection codes of your files.
20 Other local users may not read your files, or your directory itself.
10 Other local users may not write files in this directory.
4 Guest users may not change the protection codes of your files.
2 Guest users may not read your files, or your directory itself.
1 Guest users may not write files in this directory.
Calculate the protection code you want by adding the desired bits.
/
HLP2MS: ASCIZ /The protection code is a three-digit octal number.
You are now being asked for the default file protection code; this code
will be used for all new files (not overwriting old files) created in
this directory unless another protection code is explicitly supplied.
The protection code controls access for three categories of users:
yourself (same PPN), other local users, and guest users (i.e., remote
logins on NET,GUE). The bits in each file's individual protection
code are interpreted as follows (the given meaning applies
if the corresponding bit is on):
400 This file will not be saved on backup tapes by the DART program.
200 The COPY program will not allow you to delete this file without
reconfirming your intention.
100 You may not overwrite this file.
40 Other local users may not change the protection code of this file.
20 Other local users may not read this file.
10 Other local users may not overwrite this file.
4 Guest users may not change the protection code of this file.
2 Guest users may not read this file.
1 Guest users may not overwrite this file.
Calculate the default protection code you want by adding the desired bits.
/
LIST
END BEGIN